Spring Bean的定义及三种创建方式
作者:熊猫Jay
定义
Spring bean 对象是构成应用程序的支柱,也是由 Spring IoC 容器管理的。bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。这些 bean 是由用容器提供的配置元数据创建的。
创建Bean
基于XML配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="beanDemoJay" class="demo.BeanDemoJay"/> </beans>
基于注解扫描的配置
从 Spring 2.5 开始就可以使用注解来配置依赖注入,在可以使用基于注解的配置之前,我们将需要在我们的 Spring 配置文件中启用它。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 开启基于注解的配置 --> <context:annotation-config/> <!-- bean definitions go here --> </beans>
当开启后,将可以在代码上使用注解,这表明 Spring 应该自动连接值到属性,方法和构造函数。如下是常用的注解:
序号 | 说明 |
---|---|
1 | @Required 注解应用于 bean 属性的 setter 方法。 |
2 | @Autowired 注解可以应用到 bean 属性的 setter 方法,非 setter 方法,构造函数和属性。 |
3 | @Qualifier通过指定确切的将被连线的 bean,@Autowired 和 @Qualifier 注解可以用来删除混乱。 |
4 | JSR-250 AnnotationsSpring 支持 JSR-250 的基础的注解,其中包括了 @Resource,@PostConstruct 和 @PreDestroy 注解。 |
基于Java的配置
基于 Java 的配置,可以使你在不用配置 XML 的情况下编写大多数的 Spring,主要通过 @Configuration 和 @Bean 等注解。
注解 | 说明 |
---|---|
@Component | 最普通的一个注解,一般用于把普通pojo实例化到spring容器中。@Controller 和 @Service 和@Repository 是它的特殊情况,只是作为一个普通的类,不需要特殊归类时,比较适合采用@Component注解。 |
@Controller | 用于标注控制层,表示向控制层注入服务层的数据 |
@Service | 用于标注服务层,来进行业务的逻辑处理,在服务层注入DAO层数据 |
@Repository | 用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件 |
@Configuration | 用于定义配置类,可替换xml配置文件,也可以理解为Spring配置文件当中的上下文。 |
依附于@Configuration的注解
@Bean 创建Deom
@Configuration public class Demo { @Bean public Demo demo(){ return new Demo(); } }
@Import 创建Cofing
@Configuration @Import(Config.class) public class Demo { }
@Import.ImportSelector 选择器,传入@Import注解所在类Demo上所有的注解信息,返回要导入的类名
@Configuration @Import(ImportSelector_.class) public class Demo { } public class ImportSelector_ implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.spring.demo.beanlifecycle.Demo"}; } }
@Impport.ImportBeanDefinitionRegistrar Bean定义注册器,传入@Import注解所在类Demo上所有的注解信息:
Mybatis的Mapper接口就是用这种方式将Bean定义注册到Spring上下文的
@Configuration @Import(ImportBeanDefinitionRegistrar_.class) public class Demo { } public class ImportBeanDefinitionRegistrar_ implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Bean.class).setInitMethodName("init").setDestroyMethodName("destroy").getBeanDefinition(); registry.registerBeanDefinition("bean", beanDefinition); System.out.println("registerBeanDefinitions: " + beanDefinition); } }
FactoryBean
当通过“factoryBean”获取实例时,FactoryBean会调用getObject()方法;
当通过“&factoryBean”获取实例时,返回FactoryBean的实例;
当通过Demo.class来获取bean实例时,调用factoryBean的getObjectTyoe()来获取类型。
@Configuration public class Demo { @Bean public FactoryBean_ factoryBean(){ return new FactoryBean_(); } } public class FactoryBean_ implements FactoryBean { @Override public Object getObject() throws Exception { return new Demo(); } @Override public Class<?> getObjectType() { return Demo.class; } }
到此这篇关于Spring Bean的定义及三种创建方式的文章就介绍到这了,更多相关Spring Bean定义及创建内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!