1. 回顾xml方式管理Java Bean
- 将一个Bean交由Spring创建并管理
<baen id="bean" class="包名.Bean"></baen>
- 获取Spring上下文
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
- 获取Bean
Bean bean = app.getBean("bean", Bean.class);
2. 注解方式管理Java Bean
一、创建一个class配置文件
1 |
|
二、获取Spring上下文
1 | ApplicationContext context = |
三、获取Bean
1 | Bean1 bean1 = context.getBean("bean1", Bean1.class); |
2.1 简化注解方式的步骤1
一、 开启组件扫描(去掉上述步骤1中MyConfiguration实例化Bean的方法)
1 | //该注解可理解当前class等同于一个xml文件 |
在applicationContext.xml中开启组件扫描方式
<context:component-scan base-package="包路径"/>
。
二、 将交由Spring管理的类加上@Component
注解,或(@Repository
,@Controller
,@Service
)
1 | //通过构造方法实例化Bean1 |
@Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能
- @Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。
- @Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。
- @Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。
2.2 Bean别名
一、 xml形式:通过name属性或alias标签
1 | <bean id="bean1" name="bean2,bean3" class="com...Bean"/> |
二、 注解形式
1 |
|
注意:@Component只能指定一个名字,@Component默认值为类名首字母小写,也可以自定义,如:
@Component("bean1")
; 默认@scope为singleton单例,也可以进行指定
3. 注解方式Bean的注入
一、 **@Value("值")
**:常用于基本数据类型值注入,值
可用EL表达式。
1 |
|
二、 @Autowired
:常用于复杂类型值的注入
+ @Autowired
:可以用在成员变量,setter方法,构造方法上;优先按照类型进行匹配,匹配不上启用名字进行匹配。
+ @Qualifier("名字")
根据名字匹配,配合@Autowired,不能用在构造方法上;@Qualifier指定对象必须存在,否则程序报错,可以使用@Autowired的required属性来解除这种强依赖,@Autowired(required=false)
:尽量去找,组件不存在也不报错。
+ @Autowired的原理:在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性
1 |
|
三、 @Resource
:常用于复杂类型值的注入
+ @Resource:用在成员变量和setter方法上,是JDK1.6支持的注解,优先按照名字匹配,可以通过@Resource(name="名")
指定;如果没有指定name属性,用在成员变量上默认取字段名,用在setter方法上默认取属性名进行装配。名字匹配不上,会动用类型匹配。但注意:如果name属性一旦指定,就只会按照名称进行装配。
1 |
|
集合类型值注入实例
1 |
|
4. 注解方式Bean的常用配置项(作用域,生命周期,懒加载等)
4.1 注解方式Bean的作用域
1 |
|
4.2 注解方式Bean的懒加载
1 |
|
4.3 Bean初始化和销毁
一、实现InitializingBean和DisposableBean接口(xml和注解都支持)。
1 | public class Bean implements InitializingBean{ |
二、xml形式
1 | public class Bean{ |
1 | <bean id="bean" class="example.Bean" |
三、注解形式1,@Bean(initMethod=”init”, destroyMethod=”cleanup”)
1 | public class Bean{ |
四、注解形式2,添加@PostConstruct,@PreDestroy
1 |
|