目录
3.2@Import 结合 ImportSelector 接口
3.3@import结合ImportBeanDefinitionRegistrar接口
3.4@importResource 结合配置文件 classpath:spring-jdbc-zx-lsq.xml
1、目的:
阅读本文之后对于springboot中导入bean所有方式有一个整体的理解
2、简单方式
@bean @Component@Controller@Service等
@Configuration
public class ConfigurationTest {
@Bean
public ValueTest getValueTest() {
return new ValueTest();
}
}
下图显示了什么时候被@bean注解标记的方法会被处理,完整的图片地址在文末。
3、复杂方式
3.1@Import 方式
package com.defire.other;
public class ImportTest {
public String primm(){
System.out.println(11111);
return "primm";
}
}
package com.defire.other;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import({ImportTest.class})
public class ImportConfigurationTest {
}
只需要使用@Import({ImportTest.class})即可轻松引入各种bean。springboot这种情况使用
下图显示了在整个spring体现中@import注解什么时候生效,完整的图片地址在文末。
3.2@Import 结合 ImportSelector 接口
public class ImportSeletorTest implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
String[] arr = new String[1];
arr[0]="com.yeahka.demo.other.ValueTest";
return arr;
}
}
@Configuration
@Import({ImportSeletorTest.class})
public class ConfigurationTest {
}
3.3@import结合ImportBeanDefinitionRegistrar接口
package com.yeahka.demo.otherBean;
public class HelloService {
public String test(){
return toString();
}
}
@RestController
public class TestController {
@Autowired
ImportAnnotationTest importAnnotationTest;
@Autowired
HelloService helloService;
@GetMapping("/test")
public String test(){
return helloService.toString();
}
}
@Configuration
@ComponentScan("com.yeahka.demo.otherBean")
@Import({ImportSeletorTest.class,HelloImportBeanDefinitionRegistrar.class})
public class ConfigurationTest {
}
public class HelloImportBeanDefinitionRegistrar
implements ImportBeanDefinitionRegistrar {
/**
* AnnotationMetadata:引入当前类的类注解信息;
* BeanDefinitionRegistry:注册器,其registerBeanDefinition()可以注册bean
**/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
//扫描注解
Map<String, Object> annotationAttributes = importingClassMetadata
.getAnnotationAttributes(ComponentScan.class.getName());
String[] basePackages = (String[]) annotationAttributes.get("basePackages");
//扫描类
ClassPathBeanDefinitionScanner scanner =
new ClassPathBeanDefinitionScanner(registry, false);
TypeFilter helloServiceFilter = new AssignableTypeFilter(HelloService.class);
scanner.addIncludeFilter(helloServiceFilter);
scanner.scan(basePackages);
}
}
3.3的例子演示了用户自己定义,没有使用任何注解的类HelloService通过实现 ImportBeanDefinitionRegistrar方式扫描进入容器。
下图显示了框架什么时候处理实现了ImportBeanDefinitionRegistrar的这些子类。
3.4@importResource 结合配置文件 classpath:spring-jdbc-zx-lsq.xml
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class, MybatisAutoConfiguration.class},scanBasePackages = {"com.yeahka.demo.**"})
@ImportResource(locations = {
"classpath:spring-jdbc-zx-lsq.xml"
})
public class DemoApplication {
@Autowired
ValueTest valueTest;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
<?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"
xmlns:rdb="http://www.dangdang.com/schema/ddframe/rdb"
xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.dangdang.com/schema/ddframe/rdb
http://www.dangdang.com/schema/ddframe/rdb/rdb.xsd
">
<context:property-placeholder ignore-unresolvable="true"/>
<bean id="db-zx-lsq-master" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close" primary="true" >
<property name="driverClassName" value="${db.driver-class-name}"/>
<property name="url" value="${db.zx_platform_lsq_master.url}"/>
<property name="username" value="${db.zx_platform_lsq_master.username}"/>
<property name="password" value="${db.zx_platform_lsq_master.password}"/>
<property name="initialSize" value="5"/>
<property name="minIdle" value="5"/>
<property name="maxActive" value="30"/>
<property name="maxWait" value="60000"/>
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<property name="minEvictableIdleTimeMillis" value="300000"/>
<!-- 用来检测连接是否有效的sql -->
<property name="validationQuery" value="SELECT 'x'"/>
<!-- 空间时执行 validationQuery -->
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
<!-- 别名的方式配置扩展插件. stat:监控统计 -->
<property name="filters" value="stat"/>
</bean>
<bean id="db-zx-lsq-slave" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${db.driver-class-name}"/>
<property name="url" value="${db.zx_platform_lsq_slave.url}"/>
<property name="username" value="${db.zx_platform_lsq_slave.username}"/>
<property name="password" value="${db.zx_platform_lsq_slave.password}"/>
<property name="initialSize" value="5"/>
<property name="minIdle" value="5"/>
<property name="maxActive" value="30"/>
<property name="maxWait" value="60000"/>
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<property name="minEvictableIdleTimeMillis" value="300000"/>
<property name="validationQuery" value="SELECT 'x'"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
<property name="filters" value="stat"/>
</bean>
<!-- myBatis文件 -->
<bean id="sqlSessionFactory-zx-lsq" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="db-zx-lsq-master"/>
<property name="mapperLocations" value="classpath:mapper/platform_lsq/*.xml"/>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>
<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.yeahka.demo.dao"/>
<!--<property name="annotationClass" value="com.yeahka.online.provider.common.config.annotation.PlatformLsqDao"/>-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory-zx-lsq"/>
</bean>
<!-- 事务 -->
<bean id="transactionManager-zx-lsq" name="transactionManager-zx-lsq" primary="false" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="db-zx-lsq-master"/>
<qualifier value="lsq"/>
</bean>
<!-- 配置 Annotation 驱动,扫描@Transactional注解的类定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager-zx-lsq" proxy-target-class="true"/>
</beans>
下图显示了什么时候处理这个类型
图片完整地址
https://www.processon.com/view/link/5e847d98e4b07b16dcdb8a46