---------------------
一、 @Autowired、@Qualifier
还是需要在xml文件中配置bean
(一) @Autowired
位置:可以放在成员属性前面,也可以放在getter或setter方法前面,但是建议放在setter方法前面
作用:表示该对应的成员属性可以完成自动配置功能(默认是根据byType的)
例如:
xmp配置文件:
前缀部分见上面代码,以此略。。。
<bean id="u" class="com.bjsxt.dao.impl.UserDaoImpl"> </bean>
<bean name="userService" class="com.bjsxt.service.UserService"> </bean>
userService
public class UserService {
private UserDao userDao;
public UserDao getUserDao() {return userDao;}
//表示该成员属性可以自动装配(默认根据类型byType)
//annotation建议放在setter方法前面
//使用该标签,需要有一个为空的构造方法
@Autowired
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add(User u){
userDao.save(u);
}}
说明:这样spring就可以帮我们完成自动装配功能(默认是根据byType)
(二) @Qualifier
因为@Autowired默认是根据byType来自动装配注入的。当有多个相同类型的bean时,Spring就会出现异常,提示找到多个符合条件的bean,但是不知道选择哪个bean来注入。
这时我们需要另外一注解来告诉Spring用那个bean,这就是@Qualifier注解, @Qualifier使用value参数来指定注入那个bean
代码:
public class UserService {
private UserDao userDao = new UserDaoImpl();
public UserDao getUserDao() {return userDao;
}
//表示该成员属性可以自动装配(默认根据类型byType)
//当配置文件中有多个相同类型的bean时,需要使用@Qualifier注解来说明那个bean来自动装配,
//通过其value来指定需要指定的变量名
@Autowired
public void setUserDao(@Qualifier(value="u") UserDao userDao) {
this.userDao = userDao;
}
public void add(User u){ userDao.save(u);}
}
二、 @Resource(重要、推荐)
还是需要在xml文件中配置bean
(一) JSR-250
JCP:Java Community Process是由多个厂家出人来构成的J2EE组织,主要是用于定Java的一些新的标准
而每一个标签都可以称之为一个JSR
而每一个新的JSR都会加一个数字是区别什么JSR,可以到官方网看看具体JSR定了哪些新的标准。
(二) @Resource
代码:
import javax.annotation.Resource;
public class UserService {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
//注意这个@Resource是J2EE的(import javax.annotation.Resource)
//在这里引用了一个资源,这个资源的名称和这个setter方法后面的成员属性名称一致(userDao)即这里注册的bean id就是userDao
@Resource
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add(User u){userDao.save(u);}
}
说明:在这里引用了一个资源,这个资源的名称和这个setter方法后面的成员属性名称一致(userDao)
注意这个@Resource是J2EE的(import javax.annotation.Resource)
@Resource默认是根据byName来的,如果没有找到相同的名称再根据byType,当然也可以指定bean的name如下:
@Resource(name="u2")
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
注意:一般使用@Resource而不会使用@Autowired
不足:如果没有源码,就无法使用annotation, 因为注解必须写在源代码的setter上.
所以如果源码的情况下,只能使用xml
此时xml中bean注册如下:
<bean id="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl"> </bean> <bean id="u2" class="com.bjsxt.dao.impl.UserDAOImpl"> </bean> <!--这里注册的u2还被@Resource 用到这样就变成了annotation里使用xml注册的值. 其实bean注册也可以使用annotation的 见下一章节@Componet的使用--> |
三、 @Componet
以上使用@Autowired、@Resource注解时,还是需要使用在xml文件配置bean(比如需要配置注册bean id =”u2” class=”......” 这个属性.),这样就达不到完全使用annotation进行注解。因此现在引用@Component在那个bean前进行注解,表示那个类是需要的bean.
有了@Componet注解,这样就不需要在xml文件中配置bean了。
注意:@Componet是Spring的注解(org.springframework.stereotype.Component;)
例如:
前缀部分见上面代码,以此略。。。
<context:annotation-config/>
<!-- 扫描com.bjsxt下的子包,寻找配置@Component的资源.将注册入容器. -->
<context:component-scan base-package="com.bjsxt"/>
</beans><!—不需要配置bean了-->
bean类中需要使用@Componet(或@Service、@Repository、@Controller)注解这个类是bean。
代码:UserService.java
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
// @Componet注解默认bean的名称是类名首字母小写
// 也可以利用value属性指定bean的名称
@Component(value="userService") //配在对应的class上
public class UserService {
private UserDao userDao;
public UserDao getUserDao() {return userDao;}
//在这里引用了一个资源,这个资源的名称和这个setter方法后面的成员属性名称一致(userDao)
//注意这个@Resource是J2EE的(import javax.annotation.Resource)
@Resource(name="u")
public void setUserDao(UserDao userDao) {this.userDao = userDao;}
public void add(User u){userDao.save(u);}}
代码:UserDAOImpl.java
import javax.annotation.Resource;
package com.bjsxt.dao.impl;
import org.springframework.stereotype.Component;
import com.bjsxt.dao.UserDAO;
import com.bjsxt.model.User;
//默认名字为userDAOImpl , 也可以指定名字为u
@Component("u") //相当于@Component(value="u")
public class UserDAOImpl implements UserDAO {
public void save(User user) {
//Hibernate
//JDBC
//XML
//NetWork
System.out.println("user saved!");
}
}
注意:@Componet注解,默认bean的名称是类的首字母小写,当然也可以利用value属性指定bean名称(在annotation中属性为value可以不写,直接写值)
一般建议@Componet注解后面都指定名称。
说明:当Spring在加载配置文件时,发现有<context:component-scan base-package="com.bjsxt"/> 标签,并且后面的base-package属性指定了包名 ,就会在这个指定的包名下面搜索,看哪个类被@Componet注解了(注册为bean),如果有Spring就将其初始化到容器中,认为是一个bean
小结: 我们通过@Component标签来注册bean ,使得其在启动的时候被加载如Spring容器中. 而使用@Resource标签来进行ioc的指定,指定对象初始化时需要顺带依赖注入的对象是哪个. 在执行以下代码时
|