注:在学习完Spring,springMVC,Mybatis,SpringBoot等框架后看下面的知识效果更佳。
@Configuration与@Bean注解
关于@Configuration注解
添加在类的声明之前,表示这个类是一个“配置类”
如果在AnnotationConfigApplicationContext的构造方法参数中直接使用某个类,则这个类可以不添加@Configuration注解
当然,即使添加了也不会出错
虽然可以不添加,但是,只要类是用于配置的,应该添加
关于@Bean注解
在方法的声明之前,表示该方法是用于创建对象的
@Bean方法定义在配置类中
@Bean方法会在加载配置类时,由框架自动调用
@Bean方法的访问权限一般是public
其实,你可以使用任何权限,因为Spring是通过反射来调用的
从设计规范来看,应该使用public
@Bean方法的名称将用于生成Bean id
如果需要其它名称,可通过@Bean注解的属性进行配置
@Bean方法可以没有参数,也可以添加任何由Spring管理的对象作为参数
Bean的作用域
常用Spring作用域
最常用的作用域有:
组件扫描
组件扫描 – 隐式配置
组件名称
如果没有指定
名称都是自动生成的
以类名作为参考,无视类所在的包
当类名的第1个字母是大写的,第2个字母是小写的,无视其它字母大小写,组件名称是将首字母改为小之的名称
例如 TransferServiceImpl 的组件名称会是 transferServiceImpl
否则,组件名称就是类名
建议:永远不要依靠自动生成的名称!
如果指定
可通过@Component注解的属性进行配置
关于组件扫描
可以扫描多个包:
除了指定的包,其各层级的子包都会被扫描
@ComponentScan注解的参数可以是字符串数组,表示多个包名
各组件会在启动时被扫描:
除了你自己写的类,JAR依赖也会被扫描!
如果需要扫描的文件太多,可能导致启动变慢
特别是对于大型应用程序
在最坏的情况下会慢几秒
组件扫描最佳实践
生命周期注解:@PostConstruct与@PreDestroy
@PostConstruct和@PreDestroy
关于@PostConstruct和@PreDestroy
创建Bean的常见方式:
由@Bean方法返回
根据组件扫描发现并创建
然后Spring会自动调用这些方法
在创建Bean的过程中
以下这些不是Spring的注解
由JSR-250定义,从Java 6开始的部分
在 javax.annotation 包中的
由Spring和Java EE支持的
Stereotypes与Meta注解
@Autowired自动装配
@Autowired的用法
http://olivergierke.de/2013/11/why-field-injection-is-evil/
Spring的依赖注入
Environment及@Value注解和SpEL
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html
BD
Envrionment与@Value注解与SpEL
设置属性的值
考虑上一章节的这个bean的定义:
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.postgresql.Driver");
dataSource.setUrl("jdbc:postgresql://localhost/transfer");
dataSource.setUsername("transfer-app");
dataSource.setPassword("secret45");
return dataSource;
}
对这些参数字符串进行硬编码是不好的做法:
更好的做法是将这些“外部化”到一个Properties文件中去
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html