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();
}
}
Spring中基于注解方式管理bean的更多相关文章
- 跟着刚哥学习Spring框架--通过注解方式配置Bean(四)
组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Resposit ...
- Spring boot 基于注解方式配置datasource
Spring boot 基于注解方式配置datasource 编辑 Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...
- spring中基于注解使用ehcache
继续上篇,这篇介绍服务层缓存,基于注解的方式使用ehcache 注解的标签主要有4个:@Cacheable.@CacheEvict.@CachePut.@Caching,他们的用法是: @Cachea ...
- Spring中基于注解的IOC(一):基础介绍
1. Spring中的常用注解 注解配置和xml配置要实现的功能都是一样的,都要降低程序的耦合,只是配置的形式不一样 xml中配置示例: 注解分类: 1.用于创建对象的注解 它们的作用就和在xml中编 ...
- spring之通过注解方式配置Bean(一)
(1)组件扫描:spring能够从classpath下自动扫描.侦测和实例化具有特定注解的组件. (2)特定组件包括: @Component:基本注解,标识一个受spring管理的组件: @Respo ...
- spring中基于注解使用AOP
本文内容:spring中如何使用注解实现面向切面编程,以及如何使用自定义注解. 一个场景 比如用户登录,每个请求发起之前都会判断用户是否登录,如果每个请求都去判断一次,那就重复地做了很多事情,只要是有 ...
- Spring中基于注解的IOC(二):案例与总结
2.Spring的IOC案例 创建maven项目 导入依赖 pom.xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...
- Spring使用ioc注解方式配置bean
context层 : 上下文环境/容器环境 applicationContext.xml 具体示例: 现在ioc容器中添加context层支持: 包括添加xmlns:context.xsi:schem ...
- Spring中的注解配置-注入bean
在使用Spring框架中@Autowired标签时默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个.当找不到一个匹配的 Bean ...
随机推荐
- [loj2842]野猪
首先,并不一定走"除了上一次来的边"以外的最短路,但考虑"除了上一次来的边"以外的最短路和次短路(这里的次短路指最后一条边与最短路不同的"最短路&qu ...
- Redis | 第4章 Redis中的数据库《Redis设计与实现》
目录 前言 1. Redis中的数据库 2. 数据库的键空间 3. 键的生成时间与过期时间 4. Redis中的过期键删除策略 5. AOF.RDB和复制功能对过期键的处理 5.1 生成 RDB 文件 ...
- hutool的时间工具类
hutool的时间工具类 糊涂的时间工具类有很多使用方法,用到了这几个 日期向后偏移 String now = DateUtil.now(); Date date4= DateU ...
- 解决texlive化学式转换镜像经常偶发性进程堆积导致卡顿问题
前言 之前在 使用Python定时清理运行超时的pdflatex僵尸进程 博文中我采用python脚本开启定时任务清理pdflatex僵尸进程,线上4u2G的k8s pod部署了3个,pdflatex ...
- 洛谷 P5470 - [NOI2019] 序列(反悔贪心)
洛谷题面传送门 好几天没写题解了,写篇题解意思一下(大雾 考虑反悔贪心,首先我们考虑取出 \(a,b\) 序列中最大的 \(k\) 个数,但这样并不一定满足交集 \(\ge L\) 的限制,因此我们需 ...
- Codeforces 917C - Pollywog(状压 dp+矩阵优化)
UPD 2021.4.9:修了个 typo,为啥写题解老出现 typo 啊( Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1C,不过还是被我想出来了 u1 ...
- CF1578I Interactive Rays:ICPC WF Moscow Invitational Contest I 题解
题意简述:在平面上有一个坐标 \((x_c,y_c)\) 和半径 \(r\) 都是整数的圆 \((1\leq r_c\leq \sqrt{x_c^2+y_c^2}-1)\),你可以询问不超过 \(60 ...
- 实现一个简单的类似不蒜子的PV统计器
内部的放到gitlab pages的博客,需要统计PV,不蒜子不能准确统计,原因在于gitlab的host设置了strict-origin-when-cross-origin, 导致不蒜子不能正确获取 ...
- sigma网格中水平压力梯度误差及其修正
1.水平梯度误差产生 sigma坐标系下,笛卡尔坐标内水平梯度项对应形式为 \[\begin{equation} \left. \frac{\partial }{\partial x} \right| ...
- Bedtools如何比较两个参考基因组注释版本的基因?
目录 问题 思路 问题 原问题来自:How to calculate overlapping genes between two genome annotation versions? 其实可分为两个 ...