Spring中基于注解方式管理bean
操作步骤
第一步:导入相关jar包
spring IoC的基本包
Spring支持注解的Jar包
第二步:创建Spring配置文件,ApplicationContext.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:component-scan base-package="cn.hao"></context:component-scan> </beans>
第三步:使用注解方式实现bean管理
DAO层:
package cn.hao.dao; import org.springframework.stereotype.Repository; // 注解方式创建bean @Repository public class UserDAO { public void doAdd() { System.out.println("add......"); } }
Service层:
package cn.hao.service; import javax.annotation.Resource; import org.springframework.stereotype.Service; import cn.hao.dao.UserDAO; // 注解方式创建bean @Service public class UserService { // 依赖注入 @Resource private UserDAO userDAO; public void add() { this.userDAO.doAdd(); } }
测试类:
package cn.hao.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.hao.service.UserService; public class Test { public static void main(String[] args) { // 加载Spring配置文件 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 获取容器中的bean UserService userService = (UserService) context.getBean("userService"); userService.add(); } }
创建Bean的的四种注解方式
1、@Component:标注一个普通的Spring Bean 类
2、@Controller:标注一个控制器组件类
3、@Service:标注一个业务逻辑组件类
4、@Repository:标注一个DAO组件类
// 指定该类作为Spring Bean,Bean的实例名为service @Service("service") public class UserService { //...... }
若创建的Bean实例的名称没指定,默认是Bean类的首字母小写,其他部分不变。
// 指定该类作为Spring Bean,Bean的实例名默认为userService @Service public class UserService { //...... }
指定Bean的作用域的二种注解方式
1、@Scope("singleton"):单例,不写默认就是这种方式
2、@Scope("prototype"):多例
@Service @Scope("singleton") public class UserService { // 依赖注入 @Resource private UserDAO userDAO; public void add() { this.userDAO.doAdd(); } }
Bean中依赖注入的两种方式
1、@Resource
2、@Autowired
@Resource方式注入默认是按名称装配,即一旦设置了name属性,则严格按照名称进行查找装配,若没有对应的Bean,则装配失败。
@Service public class UserService { // 在Spring容器中找到名称为userDAO的Bean实例注入 @Resource(name="userDAO") private UserDAO userDAO; public void add() { this.userDAO.doAdd(); } }
注:如果没有指定name属性,默认的名称和注入的对象名称一样。若仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
@Service public class UserService { // 没有给出name属性,默认名称与要注入的属性名称一样,即userDAO @Resource private UserDAO userDAO; public void add() { this.userDAO.doAdd(); } }
@Autowired 默认按类型装配(byType), 例如,@Autowired标注了private UserDAO userDAO,则Spring会自动搜索容器中类型为UserDAO的Bean进行注入。
@Service public class UserService { // 在容器中搜索类型是UserDAO的实例对象装配 @Autowired private UserDAO userDAO; public void add() { this.userDAO.doAdd(); } }
但是按类型装配有个很大的缺陷是,如果容器中有不止一个UserDAO类型的实例,则无法正确装配,会抛出异常。可以配合@Qualifier注解,实现按名称装配的效果。
@Service public class UserService { // 两者结合实现按名称装配的效果 @Autowired @Qualifier("userDAO") private UserDAO userDAO; public void add() { this.userDAO.doAdd(); } }