1.接上面组件扫描常用标注的补充
@Scope("singleton") 指定作用域
程序默认就是单例的,prototype为多例。验证方法:
Card card = app.getBean(Card.class);
Card card2 = app.getBean(Card.class);
System.out.println(card==card2);
返回ture为单例,false为多例!
@PostConstruct 指定初始化方法
要想构造方法起作用必须在构造方法前加上这个标注!
//构造初始化方法
@PostConstruct
public void init() {
this.point="A";
}
@PreDestroy 指定销毁方法
销毁函数,起作用必须加上此标注,且程序的作用域必须是单例的
验证方法必须使用来获取对象,还要记得关闭!!
AbstractApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
app.close();
@PreDestroy
public void destory() {
System.out.println("game over");
}
2 和DI相关的标注
@Value 用来解决基本值的注入问题 如果要注入复杂值 则需要结合EL表达式
可以用在 成员变量 set方法
@Autowired 用来解决复杂值的装配问题
可以用在 成员变量 set方法 构造方法
优先使用类型进行匹配 如果类型有冲突 则启用名字进行装配
对组件的依赖是强依赖(依赖的组件必须存在 否则报错)
可以使用required属性指定是false 组件之间变成弱依赖性
也可以指定set方法参数名字查找需要结合@Qualifier
@Qualifier 不能用在构造方法上 如果找不到对应的组件 也不会启用类型查找
@Resource 是JavaEE(JDK)规范的标签非Spring框架的;也可以作用于字段或者setter方法;必须要求有匹配的对象;
找bean的方式:
1),首先按照set方法的名字去找,如果找到,就使用setter或者字段注入;
2),如果按照名字找不到,再按照类型去找,但如果找到多个匹配类型,报错;
3),可以直接使用name属性指定bean的名称;但是,如果指定的name,就只能按照name去找,如果找不到,就不会再按照类型去找;
弄清楚有四个和组件创建相关的标注有3组和组件装配的标注