Spring基于注解和XML混合⽅式的使⽤
⾸先要明⽩,基于注解和XML两种⽅式的实现功能是⼀样的,只是两种不同的配置⽅式。
⼀、IoC配置
1、配置xml
在使⽤注解与xml结合的⽅式配置IoC之前,⾸先要引⼊context标签:
xmlns:context="/schema/context"
/schema/context /schema/context/spring-context.xsd
再配置包的扫描:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance" xmlns:context="/s  <!-- 扫描com.luis包下所有使⽤注解的类型 -->
<context:component-scan base-package="com.luis" />
</beans>
此配置起的作⽤是扫描com.luis包下所有带@Component及其衍⽣注解的类
2、配置注解
2.1、@Component注解
@Component注解作⽤是将资源交给Spring进⾏管理,相当于xml中配置的bean。
通过属性value指定bean的id,若不指定则默认bean的名称为类的名称,⾸字母⼩写。
2.2、@Component衍⽣注解
@Component产⽣三个衍⽣注解-@Controller、@Service、@Repository。它们与@Component的作⽤及⽤法⼀致,习惯上表达更为清晰的意义:
@Controller:⼀般⽤于表现层(controller)的注解。
@Service:⼀般⽤于业务层(service)的注解。
@Repository:⼀般⽤于持久层(dao)的注解。
⼆、DI注解配置
DI的装配⽅式有两种:按类型装配,按名称装配。这⾥的装配相当于xml配置⽅式中的:
<property name="" ref="">
1、按类型装配
1.1、@Autowired
@Autowired默认按类型装配(byType),它是由AutowiredAnnotationBeanPostProcessor类实现。
@Autowired是spring⾃带的注解,它默认情况下要求依赖对象必须存在,如果需要允许null值,可以设置它的required属性为false,如:@Autowired(required=false)。
1.2、@Inject
@Inject是根据类型进⾏⾃动装配的,如果需要按名称进⾏装配,则需要配合@Named;
@Inject是JSR330中的规范,需要导⼊javax.inject.Inject;实现注⼊,它可以作⽤在变量、setter⽅法、构造函数上。
2、按名称装配
2.1、@Resource
@Resource默认按名称装配(byName),可以通过@Resource的name属性指定名称, @Resource属于J2EE JSR250规范的实现。
@Resource如果没有指定name属性,当注解写在字段上时,默认取字段名进⾏按照名称查,当不到与名称匹配的bean时才按照类型进⾏装配。如果name属性⼀旦指定,就只会按照名
称进⾏装配。
推荐使⽤@Resource注解,这个注解属于J2EE的,减少了与spring的耦合。相当于xml中的<property name="" value="">
2.2、注解组合
其实我们的按名称装配与按类型装配两种⽅式之间并没有明显的分界线,如@Resource也可以通过类型进⾏装配,⽽我们的按照类型装配也可以和其他注解结合的⽅式实现按照名策划那个
装配。
@Autowired可以与@Qualifier结合实现按名称装配。在⾃动按照类型注⼊的基础之上,再按照 Bean 的 id 注⼊,@Qualifier在给字段注⼊时不能独⽴使⽤,必须和@Autowire ⼀起使⽤;但是
给⽅法参数注⼊时,可以独⽴使⽤。
注意,@Autowired、@Resource、@Inject区别:
@Autowired是spring⾃带的,@Inject是JSR330规范实现的,@Resource是JSR250规范实现的,需要导⼊不同的包
@Autowired、@Inject⽤法基本⼀样,不同的是@Autowired有⼀个request属性
@Autowired、@Inject是默认按照类型匹配的,@Resource是按照名称匹配的
@Autowired如果需要按照名称匹配需要和@Qualifier⼀起使⽤,@Inject和@Name⼀起使⽤
2.3、其他注解
常⽤的注解如@Value,⽤于给基本类型和String类型注⼊值、使⽤占位符获取属性⽂件中的值
@Value(“${name}”)//name是properties⽂件中的key
spring ioc注解private String name;
bean作⽤范围注解@Scope,⽤于指定 bean 的作⽤范围,通过value进⾏取值,其值可取:singleton、prototype、request、session、globalsession
⽣命周期注解@PostConstruct、@PreDestroy,作⽤相当于xml中的<bean id="" class="" init-method="" destroy-method=""/>
另外还有⼀⼤批注解,将会在下⼀篇中进⾏说明。
三、注解和xml两种配置⽅式对⽐
两种配置⽅式各有优点:注解配置简单,维护⽅便(到类,就相当于到了对应的配置);xml修改时,不⽤改源码,不涉及重新编译和部署。因⽽具体的配置⽅式由个⼈进⾏选择。Spring管理bean⽅式对⽐:
基于xml基于注解
Bean定义<bean id="" calss=""/>@Component及其衍⽣注解
Bean名称通过id或name指定@Component("person")
Bean注⼊<property>或p命名空间@Autowired、@Resource
Bean作⽤范围、⽣命周期init-method、destory-method、scope属性@PostConstruct初始化,@PreDestroy销毁,@Scope作⽤范围设置