Spring——IOC(4)
九、Annotation——AutoWired和Qualifier
配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config></context:annotation-config>
<bean id="u" class="com.zgy.impl.UserDAOImpl">
</bean>
<bean id="userService" class="com.zgy.service.UserService" >
</bean>
</beans>
以下的这段配置配上了以后,其实就已经实例化了如下的4个bean,<context:annotation-config></context:annotation-config>
AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor, RequiredAnnotationBeanPostProcessor
使用以上的配置之后,还需要在对应的setter方法上加入对应的Annotation
package com.zgy.service;
import org.springframework.beans.factory.annotation.Autowired;
import com.zgy.dao.UserDAO;
import com.zgy.model.User;
public class UserService {
private UserDAO userDAO;
public void init(){
System.out.println("init");
}
public void add(User u){
this.userDAO.save(u);
}
public UserDAO getUserDAO() {
return userDAO;
}
@Autowired
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public void destory(){
System.out.println("destroy");
}
}
运行测试程序后,观察结果:
user saved
以上的Annotation配置与XML中的 autowire="byType"的配置作用相同。
如果想实现相当于XML中 autowire="byName"的效果,可以使用如下方法:
增加@Qualifier("u2")注解
实验:
(1)修改UserService
package com.zgy.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import com.zgy.dao.UserDAO;
import com.zgy.model.User;
public class UserService {
private UserDAO userDAO;
public void init(){
System.out.println("init");
}
public void add(User u){
this.userDAO.save(u);
}
public UserDAO getUserDAO() {
return userDAO;
}
@Autowired
public void setUserDAO(@Qualifier("u2")UserDAO userDAO) {
this.userDAO = userDAO;
}
public void destory(){
System.out.println("destroy");
}
}
(2)在配置文件中增加一个bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config></context:annotation-config>
<bean id="u" class="com.zgy.impl.UserDAOImpl">
</bean>
<bean id="u2" class="com.zgy.impl.UserDAOImpl">
</bean>
<bean id="userService" class="com.zgy.service.UserService">
</bean>
</beans>
(3)测试,观察结果:
user saved
十、Annotation——Resource
使用@Resource这个注解也可以实现注入。实现如下:
(1)在方法上加上@Resource
package com.zgy.service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Qualifier;
import com.zgy.dao.UserDAO;
import com.zgy.model.User;
public class UserService {
private UserDAO userDAO;
public void init(){
System.out.println("init");
}
public void add(User u){
this.userDAO.save(u);
}
public UserDAO getUserDAO() {
return userDAO;
}
@Resource
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public void destory(){
System.out.println("destroy");
}
}
(2)在配置文件中配置一个bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config></context:annotation-config>
<bean id="u" class="com.zgy.impl.UserDAOImpl">
</bean>
<bean id="userService" class="com.zgy.service.UserService">
</bean>
</beans>
(3)测试
package com.bjsxt.service;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.zgy.dao.UserDAO;
import com.zgy.model.User;
import com.zgy.service.UserService;
public class UserServiceTest {
@Test
public void testAdd() throws Exception {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService= (UserService) applicationContext.getBean("userService");
userService.add(new User());
}
}
(4)结论:@Resource默认是按照类型来注入的。当存在两个相同类型的bean的时候,@Resource需要加上额外的name属性指明使用的是哪一个bean
(5)范例:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config></context:annotation-config>
<bean id="u" class="com.zgy.impl.UserDAOImpl">
</bean>
<bean id="u2" class="com.zgy.impl.UserDAOImpl">
</bean>
<bean id="userService" class="com.zgy.service.UserService">
</bean>
</beans>
(6)此时需要在@Resource(name="u")用来指定是用的是名字为u的这个bean
package com.zgy.service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Qualifier;
import com.zgy.dao.UserDAO;
import com.zgy.model.User;
public class UserService {
private UserDAO userDAO;
public void init(){
System.out.println("init");
}
public void add(User u){
this.userDAO.save(u);
}
public UserDAO getUserDAO() {
return userDAO;
}
@Resource(name="u")
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public void destory(){
System.out.println("destroy");
}
}
十一、Annotation——Component
在配置文件中可以不明确的写出需要注入的bean,而是通过<context:component-scan base-package="包路径" />的形式让Spring自动所有包下的符合注入条件的bean
实验:
(1)修改配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config></context:annotation-config>
<context:component-scan base-package="com.zgy" />
<bean id="userService" class="com.zgy.service.UserService">
</bean>
</beans>
(2)在UserDAOImpl中添加@Component注解
package com.zgy.impl;
import org.springframework.stereotype.Component;
import com.zgy.dao.UserDAO;
import com.zgy.model.User;
@Component
public class UserDAOImpl implements UserDAO{
@Override
public void save(User u) {
System.out.println("user saved");
}
}
(3)在UserService中添加@Resource
package com.zgy.service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Qualifier;
import com.zgy.dao.UserDAO;
import com.zgy.model.User;
public class UserService {
private UserDAO userDAO;
public void init(){
System.out.println("init");
}
public void add(User u){
this.userDAO.save(u);
}
public UserDAO getUserDAO() {
return userDAO;
}
@Resource
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public void destory(){
System.out.println("destroy");
}
}
(4)测试:
package com.bjsxt.service;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.zgy.dao.UserDAO;
import com.zgy.model.User;
import com.zgy.service.UserService;
public class UserServiceTest {
@Test
public void testAdd() throws Exception {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService= (UserService) applicationContext.getBean("userService");
userService.add(new User());
}
}
(5)结论:
userService这个bean中的属性UserDAO属性,由于配置文件中没有配置该属性,所以会根据<context:component-scan base-package="com.zgy" />在com.zgy的包名下进行搜索,当找到@Component时,即找到了适合的信息
(6)也可以通过@Component(value="u")和Resource(name="u")的形式指定名称。
十二、Annotation——@Scope,@PostConstruct,@PreDestroy
@Scope作用是限制bean的生存范围,常用的取值有singleton、prototype
@PostConstruct定义初始化方法
@PreDestory定义销毁方法
范例:
(1)UserService.java
package com.zgy.service;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.zgy.dao.UserDAO;
import com.zgy.model.User;
@Component
@Scope("prototype")
public class UserService {
private UserDAO userDAO;
@PostConstruct
public void init(){
System.out.println("init");
}
public void add(User u){
this.userDAO.save(u);
}
public UserDAO getUserDAO() {
return userDAO;
}
@Resource(name="u")
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
@PreDestroy
public void destory(){
System.out.println("destroy");
}
}
(2)UserDAOImpl.java
package com.zgy.impl;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.zgy.dao.UserDAO;
import com.zgy.model.User;
@Component(value="u")
@Scope("prototype")
public class UserDAOImpl implements UserDAO{
@Override
public void save(User u) {
System.out.println("user saved");
}
}
(3)测试:
package com.bjsxt.service;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.zgy.dao.UserDAO;
import com.zgy.model.User;
import com.zgy.service.UserService;
public class UserServiceTest {
@Test
public void testAdd() throws Exception {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService= (UserService) applicationContext.getBean("userService");
UserService userService2= (UserService) applicationContext.getBean("userService");
System.out.println(userService == userService2);
userService.add(new User());
applicationContext.destroy();
}
}