/**
* ConditionContext:判断条件,能使用的上下文
* AnnotatedTypeMetadata:注解信息
*/
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//判断是否是linux系统
//1.获取到ioc使用的beanfactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
//2.获取类加载器
ClassLoader classLoader = context.getClassLoader();
//3.获取当前环境信息
Environment environment = context.getEnvironment();
//4.获取bean定义的注册类
BeanDefinitionRegistry registry = context.getRegistry();
//可以判断容器中的bean注册情况,也可以给容器中注册bean
boolean definition = registry.containsBeanDefinition("person");
String pString = environment.getProperty("os.name");
if(pString.contains("linux")){
return true;
}
return false;
}
/**
*@author chenmin
*@version 创建时间:2020年8月27日 下午4:06:10
*AnnotationMetadata:当前标注@Import注解的类上所有注解信息
*
*/
public class MyImportSelector implements ImportSelector {
//返回值,就是到导入到容器中的组件全类名
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.chen.bean.Blue","com.chen.bean.Yellow"};
}
}
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean definition = registry.containsBeanDefinition("com.chen.bean.Red");
boolean definition2 = registry.containsBeanDefinition("com.chen.bean.Blue");
if(definition && definition2){
//指定bean名
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class);
registry.registerBeanDefinition("rainBow", rootBeanDefinition);
}
}
}
@Bean(initMethod="init",destroyMethod="destory")
public Car car(){
return new Car();
}
public class Cat implements InitializingBean,DisposableBean{
public Cat() {
System.out.println("cat....constructor....");
}
public void destroy() throws Exception {
System.out.println("cat....destory....");
}
public void afterPropertiesSet() throws Exception {
System.out.println("cat....afterPropertiesSet....");
}
}
@PostConstruct
public void init(){
System.out.println("dog....init....");
}
@PreDestory
public void destory(){
System.out.println("dog....destory....");
}
${}配合@PropertySource("classpath:person.properties")使用,该注解放在配置类上
使用指定装配的组件id,而不是使用属性名。如下图
1.导入相关依赖
数据源,数据库驱动,spring-jdbc
2.配置数据源,jdbcTemplate操作数据库
3.给方法上标注@Transactional注解
4.给配置类标注@EnableTransactionManagement
5.将事务管理器添加到容器中
1.@EnableTransactionManagement
* 利用TransactionManagementConfigurationSelector给容器中注入两个组件:
* AutoProxyRegistrar,ProxyTransactionManagementConfiguration
* 1.AutoProxyRegistrar
* 给容器中注册一个InfrastructureAdvisorAutoProxyCreator组件
* 分析InfrastructureAdvisorAutoProxyCreator该类的作用
* 利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器)
*
* 2.ProxyTransactionManagementConfiguration
* 给容器中注册事务增强器
* 1.事务增强器要用事务注解信息,TransactionAttributeSource解析事务注解
* 2.事务拦截器:
* TransactionInterceptor;保存了事务属性信息,事务管理器
* 它是一个MethodInterceptor
* 在目标方法执行的时候:
* 执行拦截器链
* 事务拦截器:
* 1.获取事务属性
* 2.获取PlatormTransctionManager
配置数据源和事务管理器:
@EnableTransactionManagement
@ComponentScan("com.chen.tx")
@Configuration
public class TxConfig {
@Bean
public DataSource dataSource() throws Exception{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser("root");
dataSource.setPassword("root");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate() throws Exception{
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource());
return jdbcTemplate;
}
//事务管理器
@Bean
public PlatformTransactionManager platformTransactionManager() throws Exception{
PlatformTransactionManager platformTransactionManager = new DataSourceTransactionManager(dataSource());
return platformTransactionManager;
}
}