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();
}
}
最新文章
- Java面试题问与答——编译时与运行时
- 使用XML定制Ribbon的一点小前奏(稍微再进一步的理解XML)
- Bubble Sort
- C++11变长参数模板
- 七、Android学习笔记_JNI hello world
- Yii PHP 框架分析(四)
- BOM、DOM学习笔记——JavaScript
- 编程内功修炼之数据结构—BTree(一)
- Ubunu下安装mongoDB
- linux 经常使用配置
- 使用 JMeter 进行压力测试
- SharePoint Framework 在web部件中使用第三方样式 - 将第三方样式打到包中
- POJ--1056 IMMEDIATE DECODABILITY &;&; POJ--3630 Phone List(字典树)
- sqli-labs Less-11 and Less-12
- oracle case when 用法
- python 中 try ...except
- 在Ubuntu 16.04 上编译安装OpenCV3.2.0(Cmake + python3 + OpenCV3)(转)
- gm(GraphicsMagick)图片中文水印乱码问题
- 网页导出excel文件
- sql2012增加Sequence对象
热门文章
- centos7系列的网络yum源配置
- [luogu5464]缩小社交圈
- [atAGC046E]Permutation Cover
- 【Java面试题】-- Java基本类型
- 第三方登陆-qq互联
- jmeter链接数据库,信息全部填写正确,运行之后没有结果
- Ubuntu 18.04.5 LTS Ceph集群之 cephx 认证及使用普通用户挂载RBD和CephFS
- Arc123 D
- 洛谷 P5540 - [BalkanOI2011] timeismoney | 最小乘积生成树(最小生成树)
- FVCOM泥沙模块河流边界处理