1.所谓注解就是给程序看的提示信息,很多时候用来作为轻量级的配置方式。
2.Spring中除了默认的使用xml配置文件的方式实现配置之外,也支持使用注解方式,这种方式效率更高,配置信息清晰,修改更方便,推荐使用。
引入context名称空间:
在myeclipse中导入spring-contextxx.xsd约束文件,要求Spring来管理。
3.使用类注解
使用Spring的类注解可以通过注解注册类为bean,省去了配置文件中的<bean>配置。
1)开启包扫描
在spring配置文件中,开启包扫描,指定spring自动扫描那些个包下的类。
<context:component-scan base-package="具体的包名"></context:component-scan>
2)使用注解注册bean
这个包中的类会在spring容器启动时自动被扫描。检测是否需要自动配置为bean。在配置的包中的类上使用@Component注解,则这个类会被自动注册为bean,使用当前类的class为bean的class,通常情况下使用类名首字母小写为<bean>的id。
3)bean的id
可以使bean类实现BeanNameAware接口,并实现其中的setBeanName方法,spring容器会在初始化bean时,调用此方法告知当前bean的id。通过这个方式可以获取bean的id信息。
通常情况下注解注册bean使用类名首字母小写为bean的id,但是如果类名的第二个字母为大写字母则首字母保留原样。
也可以通过在@Component中配置value属性,明确的指定当前类在注册到spring时bean的id,例如:
@Component("per")(当只有一个value时可以不写"value=")
public class Person implements BeanNameAware{
@Override
public void setBeanName(String name){
System.out.println(this.getClass().getName()+"="+name);
}
}
4.使用属性注解
使用属性注解,可以为bean配置属性的注入过程,省去了在配置文件中手动进行注入配置的过程
注解注入的规则:首先按属性名字找,找不到按属性类型找,如果属性类型是个接口,去看有几个实现类,如果只有一个,那就直接注入;如果是0个或者是多个,都会抛异常
1)在配置文件中开启属性注解功能:
在<beans>标签下添加标签
<context:annotation-config></context:annotation-config>来开启
2)使用属性注解注入bean类型数据:
在bean中的属性上通过@Autowired注解来声明属性注入,也可以使用@Qualifier(value="cat")注解,明确的指定要注入哪个id的bean
3)属性注入bean类型数据的原理:
当spring容器解析xml时,发现开启了属性注解,则会在创建bean时,检测属性上是否存在@Autowired注解,如果发现该注解,则会通过当前属性的名称寻找是否存在该id的bean,如果存在则注入进来,如果不存在,再检查是否存在和当前属性类型相同的bean,如果有则注入进来,如果没有则抛出异常
也可以使用@Resource(name="id")指定注入给定的bean,但是这种方式不建议使用
4)spring内置支持注入类型的注解方式的注入-非集合类型
如果类中包含例如int、long、String等spring内置可注入的类型时,可以使用@Value注解来注入。
例如:
@Value("999")
private int id;
但是这种方式将注入的值写死在了代码中,此时我们可以将这些值配置到一个properties文件中,再在spring中进行引入,例如:
properties文件中:id=888
xml文件中<context:property-placeholder
location="classpath:/配置文件名.properties">
具体类中:
@Value("${id}")
private int id;
5)spring内置支持注入类型的注解方式的注入-集合类型
需要将集合类型的数据配置到spring配置文件中,在通过@Value引入
配置过程
将spring-util-xxx.xsd交给MyEclipse管理
在当前spring容器的配置文件中导入util名称空间
再通过适当的util标签注册数据
list集合:有序列表
<util:list id="l1">
<value>v1</value>
<value>v2</value>
<value>v3</value>
<value>v4</value>
</util:list>
set集合:去重
<util:set id="s1">
<value>v1</value>
<value>v2</value>
<value>v3</value>
<value>v4</value>
<value>v1</value>
</util:set>
map集合:新的键值覆盖旧的键值
<util:map id="m1">
<entry key="k1" value="v1">
<entry key="k2" value="v2">
<entry key="k3" value="v3">
<entry key="k1" value="v4">
</util:map>
再在类的属性中通过@Value注入赋值,@符号之后的值对应配置文件中的id
@Value("#{@l1}")
private List<String> addr;
@Value("#{@s1}")
private Set<String> addr;
@Value("#{@m1}")
private Map<String> addr;
5.其他注解
1)@Scope(value="prototype")--->配置修饰的类的bean是单例还是多例,如果不配置默认为单例
@Component
@Scope("prototype")
public class Cat{
}
2)@Lazy--->配置修饰的类的bean采用懒加载机制
例如:
@Component
@Lazy
public class Cat{
public Cat(){
System.out.println("Cat被创建出来了");
}
}
3)@PostConstruct
在bean对应的类中修饰某个方法,将该方法声明为初始化方法,对象创建之后立即执行
4)@PreDestroy
在bean对应的类中,修饰某个方法,将该方法声明为销毁的方法,对象销毁之前调用该方法
例如:
@Component
public class Cat{
public Cat(){
System.out.println("Cat被创建出来了");
}
@PostConstruct
public void init(){
System.out.println("Cat的初始化方法");
}
@PreDestroy
public void destroy(){
System.out.println("Cat的销毁方法");
}
}