Spring-Configuration-运用注解配置bean
来源:互联网 发布:python黑客编程视频 编辑:程序博客网 时间:2024/05/22 02:03
一般对spring比较熟悉得使用xml来注入bean,spring3之后注解则越来越丰富 特别最近使用spring-boot,集成了spring和tomcat等容器,减少了application.xml和web.xml的配置 所以bean的注入都移到了Configuration的class中。
复杂问题简单化:Configuration和xml的配置文件的各属性可一一对应,下面列几个注解本次有用到过的,应该也就是常用的了。
- @Configuration:表示这个class需要spring启动时做配置
- @ComponentScan:此配置上下文需要扫描的package,类似于xml中的配置
<context:component-scan base-package="com.biz.dao.**.*"/>
- @ImportAutoConfiguration(MyBatisConfig.class):引入其他配置的资源,类似于xml中的配置
<import resource="classpath:biz-context.xml"/>
- @Autowired @Resource:在configuration中自动引入bean,此bean应满足三个条件:
- 类定义中有注解@Component:表示是spring扫描时可装载为bean
- 此configuration中扫描包含此类
- 此类中入有@Autowired @Resource的bean需同样满足以上两个条件
类似于xml中的ref属性,例如:
<bean id="logMessage" class="com.***.LogMessage"/><bean id="messageFactory" class="com.**.MessageFactoryImpl"> <property name="messageMap"> <map> <ref key="log" value-ref="logMessage"/> </map> </property></bean>
- @AutoConfigureAfter(MyBatisConfig.class):表示在MyBatisConfig.class配置完成后加载此配置项
- @AutoConfigureOrder:设定加载顺序,实际操作貌似没啥用
- @EnableTransactionManagement
- @ConfigurationProperties(prefix=”datasource”):spring-boot中用到的,在application.yml中可指定此配置文件的属性,以prefix中指定的datasource为识别key,例如:
class定义:
@Component@ConfigurationProperties(prefix="datasource")public class DataBaseConfig { private String url; private String username; private String password; //get set方法省略}
application.yml
datasource: name: datasource initialize: false url: jdbc:log4jdbc:mysql://127.0.0.1:3306/es_test?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF8 username: root password: ************** driverClassName: com.mysql.jdbc.Driver
PS:这种场景类似于xml中注入一个bean,bean属性均为常量的情况,例如:
<bean id="datasource" class="com.mysql.jdbc.Driver"> <property name="url" value="127.0.0.1"/> <property name="username" value="root"/> <property name="password" value="*****"/></bean>
最后举个栗子:
- 首先需要配置数据库
@ComponentScan({ "com.***.conf"})@Configuration@EnableTransactionManagementpublic class MyBatisConfig implements TransactionManagementConfigurer { private static final Logger log = LoggerFactory.getLogger(MyBatisConfig.class); @Autowired DataBaseConfig dataConfig; @Bean public Filter statFilter() { StatFilter statFilter = new StatFilter(); statFilter.setSlowSqlMillis(5000); statFilter.setLogSlowSql(true); statFilter.setMergeSql(true); return statFilter; } @Bean public Filter logFilter() { Slf4jLogFilter filter = new Slf4jLogFilter(); filter.setStatementExecutableSqlLogEnable(true); return filter; } @Bean(destroyMethod = "close", initMethod = "init") public DataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(dataConfig.getUrl()); dataSource.setUsername(dataConfig.getUsername()); dataSource.setPassword(dataConfig.getPassword()); dataSource.setDriverClassName("net.sf.log4jdbc.sql.jdbcapi.DriverSpy"); dataSource.setMaxActive(100); dataSource.setMinIdle(50); dataSource.setInitialSize(2); dataSource.setMaxWait(500); dataSource.setProxyFilters(Lists.<Filter>newArrayList(statFilter(),logFilter())); return dataSource; } @Bean(name = "sqlSessionFactory") public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource) { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); // 分页插件 PageHelper pageHelper = new PageHelper(); Properties properties = new Properties(); properties.setProperty("reasonable", "true"); properties.setProperty("supportMethodsArguments", "true"); properties.setProperty("returnPageInfo", "check"); properties.setProperty("params", "count=countSql"); properties.setProperty("dialect", "mysql"); properties.setProperty("offsetAsPageNum", "true"); pageHelper.setProperties(properties); // 添加插件 bean.setPlugins(new Interceptor[] { pageHelper }); Properties configurationProperties = new Properties(); configurationProperties.setProperty("cacheEnabled", "true"); configurationProperties.setProperty("lazyLoadingEnabled", "true"); configurationProperties.setProperty("multipleResultSetsEnabled", "true"); configurationProperties.setProperty("useColumnLabel", "true"); configurationProperties.setProperty("mapUnderscoreToCamelCase", "true"); configurationProperties.setProperty("defaultExecutorType", "REUSE"); configurationProperties.setProperty("defaultStatementTimeout", "25000"); // 添加XML目录 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); try { bean.setConfigurationProperties(configurationProperties); bean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml")); return bean.getObject(); } catch (Exception e) { log.error("[MyBatisConfig-sqlSessionFactoryBean]error", e); throw new RuntimeException(e); } } @Bean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } @Bean @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return new DataSourceTransactionManager(dataSource()); }}
- 然后配置各种bean
@ComponentScan({"com.**.message","com.**.service.*","com.**.dao.*"})@Configuration@ImportAutoConfiguration(MyBatisConfig.class)public class BeanConfig { @Autowired LogMessage logMessage;//只有ComponentScan过的bean才能在这里自动绑定 @Bean(name = "messageFactory") public MessageFactory messageFactoryBean(){ MessageFactoryImpl factory = new MessageFactoryImpl(); Map<MessageType,CommunicateMessage> map = Maps.newHashMap(); map.put(MessageType.LOG_MESSAGE,logMessage); factory.setMessageMap(map); return factory; }}
总结:配置时遇到了一些问题,例如@Autowire后编译错误(是因为没有@ComponentScan相应的包),网上资料说破坏了加载顺序什么的要定义为static,定义为static后注入bean始终为null(当然了,只是初始化占了一个static位置而已,并未真正注入)。这些问题归根到底是因为不了解@Configuration的加载原理。总之,了解了spring加载顺序,理解@Configuration的class和xml配置文件一一对应,另外了解各注解使用方法即可顺当地做配置~(≧▽≦)/~啦啦啦
0 0
- Spring-Configuration-运用注解配置bean
- Spring注解:@Configuration和@Bean
- 使用@Configuration注解来代替Spring的bean配置
- Spring -- 注解配置Bean
- spring 注解配置bean
- Spring - 注解配置Bean
- spring注解@Configuration,@Value,@Bean实例
- spring的注解(1): @Configuration,@Bean,@Component,
- Spring整理系列(11)——@Configuration注解、@Bean注解以及配置自动扫描、bean作用域
- Spring Bean配置:注解配置
- spring 注解方式配置Bean
- spring 注解扫描bean配置
- Spring基于注解配置Bean
- spring 注解方式配置Bean
- spring通过注解配置Bean
- spring之注解配置bean
- Spring通过注解配置bean
- Spring通过注解配置bean
- form表单回车自动提交(禁止)
- Spring 的事务处理浅谈
- 二分法求平方根
- linux Kill 多个进程
- junit测试延伸--私有方法测试
- Spring-Configuration-运用注解配置bean
- WMI技术介绍和应用——Instance/Method Provider
- linux下socket编程示例(TCP协议)
- Hadoop内部的限流机制
- 总结反思
- LeetCode 73. Set Matrix Zeroes
- Memcached安装使用和源码调试
- oracle 11g 卸载
- 网络请求 cookie的添加