1.配置组件
@Configuration和@Bean
@Configuration和@Bean注解配套使用,首先这个类是一个IOC容器,方法加了一个这个@Bean注解,一般这样的方法返回的都是一个对象,我们就可以直接从这个类中拿到这个实例,并且是单例的,我们可以通过AnnotationApplicationContext context = new AnnotationApplicationContext(加了@Configuration注解的类)去获取到这个bean对象
标注在类上,该类会被CGLIB动态代理生成子类,可以达到这样的效果:在某@Bean方法下调用另一个标注了@Bean的方法,得到的会是同一个Bean对象;
@ConponentScan
该注解默认会扫描该类所在的报下所有的配置类
@Scope
@Scope("prototype")//多实例,IOC容器启动创建的时候,并不会创建对象放在容器在容器当中,当你需要的时候,需要从容器当中取该对象的时候,就会创建。
@Scope("singleton")//单实例 IOC容器启动的时候就会调用方法创建对象,以后每次获取都是从容器当中拿同一个对象(map当中)。
@Scope("request")//同一个请求创建一个实例
@Scope("session")//同一个session创建一个实例
@Lazy
延迟初始化
@Conditional(WinCondition.class)
条件主键,里面的类实现Condition,然后实现matches方法,返回的boolean值,如果为true,则执行该方法
@Import
导入外部资源
带有@Configuration的配置类
public class TestA {
public void fun(String str) {
System.out.println(str);
}
public void printName() {
System.out.println("类名 :" +Thread.currentThread().getStackTrace()[1].getClassName());
}
}
@Import({TestA.class})
@Configuration
public class ImportConfig {
}
ImportConfig,在类上面加上@Configuration,加上@Configuration是为了能让Spring 扫描到这个类,并且直接通过@Import引入TestA类
ImportSelector 的实现
public class TestC {
public void fun(String str) {
System.out.println(str);
}
public void printName() {
System.out.println("类名 :" + Thread.currentThread().getStackTrace()[1].getClassName());
}
}
public class SelfImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.test.importdemo.TestC"};
}
}
SelfImportSelector.class 实现ImportSelector 接口,注入TestC.class
@Import({TestA.class,TestB.class,SelfImportSelector.class})
@Configuration
public class ImportConfig {
}
ImportConfig上面引入SelfImportSelector.class
ImportBeanDefinitionRegistrar 的实现
public class TestD {
public void fun(String str) {
System.out.println(str);
}
public void printName() {
System.out.println("类名 :" + Thread.currentThread().getStackTrace()[1].getClassName());
}
}
public class SelfImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition root = new RootBeanDefinition(TestD.class);
registry.registerBeanDefinition("testD", root);
}
SelfImportBeanDefinitionRegistrar.class,实现接口ImportBeanDefinitionRegistrar,注入TestD.class
@Import({TestA.class,TestB.class,SelfImportSelector.class,
SelfImportBeanDefinitionRegistrar.class})
@Configuration
public class ImportConfig {
}
ImportConfig类上加上导入SelfImportBeanDefinitionRegistrar.class
2.生命周期控制
@PostConstruct用于指定初始化方法
@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:
Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
@PreDestory
用于指定销毁方法
@DependsOn
定义bean初始化及销毁时的顺序,可能有些场景中,bean A 间接依赖 bean B。如Bean B应该需要更新一些全局缓存,bean A需要使用该缓存;因此,如果bean B没有准备好,bean A无法访问。
@Configuration
@ComponentScan("com.logicbig.example")
public class AppConfig {
@Bean(initMethod = "initialize")
@DependsOn("eventListener")
public EventPublisherBean eventPublisherBean () {
return new EventPublisherBean();
}
@Bean(name = "eventListener", initMethod = "initialize")
// @Lazy
public EventListenerBean eventListenerBean () {
return new EventListenerBean();
}
public static void main (String... strings) {
new AnnotationConfigApplicationContext(AppConfig.class);
}
}
EventListenerBean initializing
EventPublisherBean initializing
event received in EventListenerBean : event published from EventPublisherBean
@ApplicationContextAware
可以通过这个上下文环境对象得到Spring容器中的Bean
@BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor实现了BeanFactoryPostProcessor接口,是spring框架的BeanDefinitionRegistry的后处理器,用来注册额外的BeanDefinition
3.切面组件
@Transactional
配置声明式事务信息
@EnableTransactionManagement
添加对事务管理的支持