配置注解组件
@Configuration 将一个类作为IOC容器,如果在类方法加上@Bean的注解,就会作为这个Spring容器的一个Bean。
示例代码 @Configuration public class MyConfig { @Bean("yu")//优先取定义的bean name public Person person1(){//如无定义则去方法名 return new Person("Yu",18); } } 调用代码 public class MyTest { @Test public void test() { ApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class); Object bean = app.getBean("yu"); System.out.println(bean); } }
@ComponentScan 包扫描注解,在配置类上添加此注解,即可扫描指定路径下的所在包的所有配置类,相当于xml配置中的<context:component-scan>。默认只扫描@Controller,@Service,@Repository,@Component注解。
@Configuration @ComponentScan(value = "com.gupaoedu.project") public class MyConfig { }
@Scope 用于指定作用域,作用于类上。
示例代码 @Configuration public class MyConfig { //prototype 原型,多例 //singleton 单例,默认值 //request 主要应用于web模块,同一次请求只创建一个实例 //session 主要应用于web模块,同一个session只创建一个实例 @Scope("prototype") @Bean public Person person(){ //IoC实例化对象的时候,并不是简单地调用我们定义的方法 return new Person("Yu",18); } }
@Lazy 表示延迟加载, 只对单例Bean起作用, 默认非延迟加载。
示例代码: @Configuration public class MyConfig { //懒加载只针对单例Bean起作用 //默认容器启动时不创建对象,调用对象的功能时才创建 @Lazy @Bean public Person person(){ System.out.println("将对象添加到IoC容器中"); return new Person("Yu",18); } }
@Conditional 从Spring4开始提供使用,根据给定的条件判断,满足条件才给IOC注册Bean。
示例代码 @Configuration public class MyConfig { //WinCondition和LinuxCondition需要实现Condition接口 @Conditional(WinCondition.class) @Bean public Person win(){ System.out.println("将对象Win添加到IoC容器中"); return new Person("Win",16); } @Conditional(LinuxCondition.class) @Bean public Person linux(){ System.out.println("将对象Linux添加到IoC容器中"); return new Person("Linux",17); } }
@Import 导入外部资源
示例代码 @Configuration @Import(value = {Cat.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class}) public class MyConfig { @Bean public Company company(){ return new Company(); } //给IoC中注册Bean的方式 //1、@Bean 直接导入单个类 //2、@ComponentScan 包扫描默认是扫描(@Controller、@Service、@Repository、@Component) //3、@Import 快速给容器导入组件Bean // a. @Import 直接传参导入 // b. ImportSelector 自定义导入规则 // c.ImportBeanDefinitionRegistrar ,使用BeanDefinitionRegistry可以手动注入到IoC容器中 //4、FactoryBean 把需要注入的对象封装为FactoryBean // a、FactoryBean 负责将Bean注入到容器的Bean // b、BeanFactory 从IoC中获得Bean对象 @Bean public Person person(){ return new Person("Yu",18); } @Bean public MyFactoryBean monkey(){ return new MyFactoryBean(); } }
总结,给IoC中注册Bean的方式
1. @Bean 直接导入单个类
2. @ComponentScan 包扫描默认是扫描(@Controller、@Service、 @Repository、@Component)
3. @Import 快速给容器导入组件Bean
a. @Import 直接传参导入
b. ImportSelector 自定义导入规则
c.ImportBeanDefinitionRegistrar ,使用BeanDefinitionRegistry可以手动注入到IoC容器中
4. FactoryBean 把需要注入的对象封装为FactoryBean
a. FactoryBean 负责将Bean注入到容器的Bean
b. BeanFactory 从IoC中获得Bean对象