spring 注解方式注入

配置注解

在xml文件中配置

<!-- 启动spring注解 -->                                   
<context:annotation-config/>                          
<!-- 扫描包 -->                                          
<context:component-scan base-package="self.exercise"/>

使用注解

模拟实际开发中的项目层次结构,分别在UserDaoImpl、UserServiceImpl和UserController中实现注解注入。

UserDapImpl

@Component//相当于xml方式中的<bean class="self.exercise.dao.impl.UserDaoImpl" id="userDaoImpl"/>  
public class UserDaoImpl implements UserDao {                                              
                                                                                           
    @Override                                 
    public void print() {                                                                  
        // TODO Auto-generated method stub                                                 
        System.out.println("userDaoImpl");                                                 
    }                                                                                      
  
} 

@Component注解有属性value,可以指定id值,如果不指定,默认的id为类名的首字母小写。

UserServiceImpl

@Component("userService") // 相当于xml方式中的<bean class="self.exercise.service.impl.UserServiceImpl" id="userService"></bean>  
public class UserServiceImpl implements UserService {                                                
                                                                                                     
    UserDao userDao;                                                                                 
    @Resource(name = "userDaoImpl") // 相当于xml方式中的<property name="userDao" ref="userDaoImpl"/>        
    public void setUserDao(UserDao userDao) {                                                        
        this.userDao = userDao;                                                                      
    }                                                                                                
                                                                                                     
    @Override                                                                                        
    public void print() {                                                                            
        System.out.println("userServiceImpl");                                                       
        userDao.print();                                                                             
    }                                                                                                
}                                                                                                    

UserServiceImpl中有一个属性userDao,使用setter方式注入。换成构造函数方法注入也可以。

@Resource注解的匹配原则:如果设置了name值,匹配与name值相同的id;如果id不匹配,如果没有设置name值,匹配与set方法之后部分(UserDao)的首字母小写;如果还未匹配到,匹配与set方法中参数类型相同的。

UserController

@Component                                               
public class UserController {                            
                                                         
    UserService userService;
    //未指定name值,匹配d="userService"的class                             
    @Resource()                                          
    public void setUserService(UserService userService) {
        this.userService = userService;                  
    } 
                                                           
    public void print() {                                
        System.out.println("USerController");            
        userService.print();                             
    }                                                                                                       
}                                                        

优化

UserDaoImpl

@Repository // 相当于xml方式中的<bean class="self.exercise.dao.impl.UserDaoImpl" id="userDaoImpl"/>  
public class UserDaoImpl implements UserDao {                                                 
                                                                                              
    @Override                                                                                 
    public void print() {                                                                     
        System.out.println("userDaoImpl");                                                    
    }                                                                                         
                                                                                              
}                                                                                             

UserServiceImpl

@Service() // 相当于xml方式中的<bean class="self.exercise.dao.impl.UserDaoImpl" id="userDaoImpl"></bean>  
public class UserServiceImpl implements UserService {                                              
                                                                                                   
    @Autowired                                                                                     
    @Qualifier(value = "userDaoImpl") // 匹配id                                                      
    UserDao userDao;// 相当于xml方式中的<property name="userDao" ref="userDaoImpl"/>                      
                                                                                                   
    @Override                                                                                      
    public void print() {                                                                          
        System.out.println("userServiceImpl");                                                     
        userDao.print();                                                                           
    }                                                                                              
                                                                                                   
}                                                                                                  

去掉了setter或构造函数的注入方式,Autowired会实现自动注入;AutoWired注解没有属性可以用来匹配id,需要用@Qualifier匹配。

UserController

@Controller
@Scope(
"prototype") public class UserController { @Autowired private UserService userService; public void print() { System.out.println("USerController"); userService.print(); } }

@Repository、@Service、@Controller都被@Component注解修饰。

原文地址:https://www.cnblogs.com/qingyaxuan/p/6550662.html