注解名称 | 说明 |
1.@Configuration | 把一个类作为一个loC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。 |
2.@ComponentScan | 在配置类上添加@ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的<context:component-scan>默认扫描(@Controller、@Service、@Repostory、@Component) |
3.@Scope | 用于指定scope作用域的(用在类上) |
4.@Lazy | 表示延迟初始化(就是只有当我们调用bean的时候,这个bean才会被初始化)@Lazy只对单例bean起作用 |
5.@Conditional | Spring4开始提供,它的作用是按照一定的条件进行判断,满足条件给容器注册Bean。属性是实现了Conditional接口的类 |
6.@Import | 导入外部资源 |
7.给Ioc容器注册Bean的方式 | @Bean直接导入单个类 @ComponentScan 默认扫描(@Controller.@Service、@Repostory、@Component) @Import快速给容器导入Bean的方式 FactoryBean把需要注册的对象封装为FactoryBean |
8.bean生命周期控制 | @PostConstruct用于指定初始化方法(用在方法上) @PreDestory用于指定销毁方法(用在方法上) @DependsOn :定义Bean初始化及销毁时的顺序 |
1. @Configuration:
@Configuration public class MyConfig { // getbean()取值顺序 //默认是类名首字母小写 //其次是取方法名 //最后有限取Bean的注解的value //@Bean @Bean(name="person") public Person getPerson(){ return new Person("胡子"); } }
public class MyConfigTest { @Test public void test(){ ApplicationContext app = new nnotationConfigApplicationContext(MyConfig.class); Object bean1 = app.getBean("person"); Object bean2 = app.getBean("person"); System.out.println(bean1==bean2);//打印ture Object person = app.getBean(Person.class); System.out.println(person); } }
2.@ComponentScan
默认扫描(@Controller、@Service、@Repostory、@Component)
@ComponentScan的重要属性:
value 代表扫描的包 value = "com.ws.project"代表扫描com.ws.project包下面所有的类
useDefaultFilters = true;默认是true 代表使用默认的策略 也就是扫描注解
useDefaultFilters = false代表使用别的策略
includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Controller.class)}},//代表扫描com.ws.project 下的Controller注解所在的类
includeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StudentService.class)} //代表扫描com.ws.project 下的StudentService类
//@ComponentScan.Filter(type = FilterType.CUSTOM)自己扩展策略
@Configuration @ComponentScan(value="com.annotation.confiuration", includeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Person.class)}, useDefaultFilters = false) public class ComponentScanConfig { }
public class ComponentScanTest { @Test public void test(){ ApplicationContext app = new AnnotationConfigApplicationContext(ComponentScanConfig.class); String[] beanDefinitionNames = app.getBeanDefinitionNames(); System.out.println(Arrays.toString(beanDefinitionNames)); } }
3.@Scope
Scope的value属性:
- prototype原型,多例
- singleton单例
- request主要应用于web模块同一次请求只创建一个实例
- session主要应用于web模块,同一个session只创建一个对象
默认是单例
4.@Lazy
Lazy只对单例bean起作用
默认容器启动时不创建对象,调用对象功能的时候才创建对象
5..@Conditional
条件类是实现了Conditional接口的类
-ea -Dos.name=linux
6.@Import
直接导入单个的类
快速给容器导入bean的方式
实现ImportSeletor自定义规则实现
实现ImportBeanDefinitionRegistrar 获得BeanDefinitionRegistry 可以手动直接往IOc容器里面塞bean
FactoryBean把需要注册的对象封装为FactoryBean
FactoryBean负责给Bean注册到IOC的bean
BeanFactory从IOc容器获取Bean对象
@Configuration @Import(value = {Person.class}) public class ImportConfigTest { //直接导入单个的类 @Bean public Person getPerson(){ return new Person("胡子"); } }