@Autowired和@Resource的区别用法
1、@Resource注解
@Resource 没有指定 name 和 type ,则先使用byName注入策略, 如果匹配不上, 再使用 byType 策略, 如果都不成功,就会报错。
public class UserAction { // @Autowired @Resource(type = UserService.class) private UserService userService400;//如果按照类型,要求容器中只能有一个对象 public void sayOk(){ System.out.println("UserService="+userService400); userService400.hi(); } public void setUserService(UserService userService) { this.userService400 = userService; } }
错误示范:
<bean class="com.linghu.service.UserService" id="userService100"/> <bean class="com.linghu.service.UserService" id="userService200"/> <bean class="com.linghu.service.UserService" id="userService300"/>
错误原因:这里的 @Resource(type = UserService.class)
表示这个注解通过类型进行自动装配和注入。类型就是 UserService
对象类型的,去bean里扫描,如果找到bean的类型有重复的 UserService
的就会注入失败~
正确示范:
<bean class="com.linghu.service.UserService" id="userService100"/>//容器只有一个对象 <!-- <bean class="com.linghu.service.UserService" id="userService200"/>--> <!-- <bean class="com.linghu.service.UserService" id="userService300"/>-->
如果按照name属性:
public class UserAction { // @Autowired @Resource(name = "userService01")//去容器里找name相同的bean对象 private UserService userService400;// public void sayOk(){ System.out.println("UserService="+userService400); userService400.hi(); } public void setUserService(UserService userService) { this.userService400 = userService; } }
正确示范:
<bean class="com.linghu.service.UserService" id="userService100"name="userService01"/>
public class Springtest { public static void main(String[] args) { ApplicationContext gt = new ClassPathXmlApplicationContext("beans03.xml"); Object userService100 = gt.getBean("userService100");//通过类型获取bean对象 System.out.println("UserService="+us); } }
2、@Autowired注解
@Controller("userAction01")//bean 的 id=userAction01 public class UserAction { @Autowired private UserService userService;//将Userservice对象注入到UserAction中,可以调用UserService的方法了。相当于在这个类new了一个UserService类的对象。 public void sayOk(){ System.out.println("UserService="+userService); userService.hi(); } }
在Bean文件配置如下: 加入两个自动扫描,扫描两个子包 component
和 service
下的组件类。就不用设置bean对象了,因为bean对象已经被上面的注解代替了。
<context:component-scan base-package="com.linghu.component"/> <context:component-scan base-package="com.linghu.service"/>
public class Springtest { public static void main(String[] args) { ApplicationContext gt = new ClassPathXmlApplicationContext("beans03.xml"); UserAction userAction = (UserAction) gt.getBean(UserAction.class);//获取对象 //UserAction userAction = (UserAction) gt.getBean("userAction01");//也可以这样获取对象 System.out.println(userAction); userAction.sayOk(); } }