配置注解
在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注解修饰。