Spring(四)注解配置Ioc
原文链接:http://www.orlion.ga/216/
一、@Autowired
beans.xml配置成如下:
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl"> </bean> <bean id="userService" class="ml.orlion.service.UserService"> </bean> </beans>
当我们在配置文件中配置了<context:annotation-config/>时,spring会自动帮我们初始化四个bean(AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor)来处理我们在代码中的注解
然后UserService.java:
代码中的注解@Autowired默认是byType,所以beans.xml中不能出现两个类型相同的bean,因为如果类型一致spring就不知道应该注入哪一个了。
package ml.orlion.service;
import org.springframework.beans.factory.annotation.Autowired;
import ml.orlion.dao.UserDAO;
import ml.orlion.dao.impl.UserDAOImpl;
import ml.orlion.model.User;
public class UserService {
    private UserDAO userDAO = new UserDAOImpl();
    public UserDAO getUserDao() {
        
        return userDAO;
    }
    @Autowired
    public void setUserDao(UserDAO userDAO) {
        this.userDAO = userDAO;
    }
    
    public void saveUser(User user){
        this.userDAO.saveUser(user);
    }
}
测试一下
BeanFactory appContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) appContext.getBean("userService");
userService.saveUser(new User());
输出saving user,即成功调用了UserDAOImpl中的save方法
上边的代码有一个限制就是beans.xml中一个类只能配置一个bean,比如beans.xml配置成如下这样时就会报错
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl"> </bean> <bean id="userDao1" class="ml.orlion.dao.impl.UserDAOImpl"> </bean> <bean id="userService" class="ml.orlion.service.UserService"> </bean> </beans>
这时候可以把UserService类改成如下(在setUserService方法中加注解)
package ml.orlion.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import ml.orlion.dao.UserDAO;
import ml.orlion.dao.impl.UserDAOImpl;
import ml.orlion.model.User;
public class UserService {
    private UserDAO userDAO = new UserDAOImpl();
    public UserDAO getUserDao() {
        
        return userDAO;
    }
    @Autowired
    public void setUserDao(@Qualifier("userDao") UserDAO userDAO) {
        this.userDAO = userDAO;
    }
    
    public void saveUser(User user){
        this.userDAO.saveUser(user);
    }
}
这时候再运行就不会报错了。
二、@Reosource
从bean容器中注入bean,默认是按名字查找,找不到再按类型,可以指定名字
beans.xml中配置
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl"> </bean> <bean id="userDao1" class="ml.orlion.dao.impl.UserDAOImpl"> </bean> <bean id="userService" class="ml.orlion.service.UserService"> </bean> </beans>
UserService.java:
package ml.orlion.service;
import javax.annotation.Resource;
import ml.orlion.dao.UserDAO;
import ml.orlion.dao.impl.UserDAOImpl;
import ml.orlion.model.User;
public class UserService {
	private UserDAO userDAO = new UserDAOImpl();
	public UserDAO getUserDao() {
		
		return userDAO;
	}
	@Resource(name="userDao")
	public void setUserDao(UserDAO userDAO) {
		this.userDAO = userDAO;
	}
	
	public void saveUser(User user){
		this.userDAO.saveUser(user);
	}
}
测试可以运行会输出saving user
三、@Component
将一个类声明为spring的bean
beans.xml
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <context:component-scan base-package="ml.orlion"></context:component-scan> </beans>
其中<context:component-scan base-package="ml.orlion"></context:component-scan>表示从包名为ml.orlion下的所有类中找Component.
UserDAOImpl.java
package ml.orlion.dao.impl;
import org.springframework.stereotype.Component;
import ml.orlion.dao.UserDAO;
import ml.orlion.model.User;
@Component("userDao") //默认名字是userDaoImpl
public class UserDAOImpl implements UserDAO{
	public void saveUser(User user){
		System.out.println("save usering");
	}
}
UserService.java
package ml.orlion.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import ml.orlion.dao.UserDAO;
import ml.orlion.dao.impl.UserDAOImpl;
import ml.orlion.model.User;
@Component("userService")
public class UserService {
	private UserDAO userDAO = new UserDAOImpl();
	public UserDAO getUserDao() {
		
		return userDAO;
	}
	@Resource(name="userDao")
	public void setUserDao(UserDAO userDAO) {
		this.userDAO = userDAO;
	}
	
	public void saveUser(User user){
		this.userDAO.saveUser(user);
	}
}
测试一下:
BeanFactory appContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) appContext.getBean("userService");
userService.saveUser(new User());
运行会输出saving user
四、@Scope、@PostConstruct、@PreDestroy
可以在类定义之前添加注释@Scope("prototype")将bean声明为每次调用时都重新new一个。
@PostConstructbean声明在初始化时运行的方法
@PreDestroy声明在销毁时运行的方法
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号