Spring之旅第四篇-注解配置详解
一、引言
最近因为找工作,导致很长时间没有更新,找工作的时候你会明白浪费的时间后面都是要还的,现在的每一点努力,将来也会给你回报的,但行好事,莫问前程!努力总不会有错的。
上一篇Spring的配置博客评论中有园友指出现在很少用xml类配置SpringBean了,都是用注解的方式来进行配置,那么这篇就来讲注解配置。
使用.xml文件来对bean进行注入的缺点很明显:文件会十分庞大,如果分多模块去配置,文件又特别的多,这些会导致可读性和可维护性变差。
为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。
二、将对象注册到容器
注解如何使用呢,分为三步
第一步:在 applicationContext.xml 中引入命名空间

第二步:在 applicationContext.xml 文件中引入注解扫描器
<context:component-scan base-package="com.yuanqinnan.test" ></context:component-scan>
base-package:表示含有注解类的包名
如果扫描多个包,则上面的代码书写多行,改变 base-package 里面的内容即可!
如果使用Idea引入注解扫描器,就会直接引入命名空间
第三步:在 Car 类中添加注解@Component
@Component
public class Car { private String Color; public String getColor() {
return Color;
} public void setColor(String color) {
Color = color;
} @Override
public String toString() {
return "Car{" +
"Color='" + Color + '\'' +
'}';
}
}
第四步:测试
ApplicationContext ctx=new ClassPathXmlApplicationContext("META-INF/applicationContext.xml");
//获取bean的实例
Car car=(Car) ctx.getBean("car");
System.out.println(car.toString());
结果:Car{Color='null'}
三、值类型注入
@Value("yellow")
public void setColor(String color) {
Color = color;
}
结果:Car{Color='yellow'}
四、引用类型注入
引用类型分为自动装配@Autowired和手动注入@Resource
4.1 @Autowired
顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。
@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。
创建一个新类Boss
@Component
public class Boss {
//自动装配
@Autowired
private Car car; private String name;
@Value("袁帅")
public void setName(String name) {
this.name = name;
} public String getName() { return name;
} @Override
public String toString() {
return "Boss{" +
"car=" + car.getColor() +
", name='" + name + '\'' +
'}';
}
}
测试:
Boss boss=(Boss)ctx.getBean("boss");
System.out.println(boss.toString());
结果:Boss{car=yellow, name='袁帅'}
这种方式存在匹配到多个类型一致的的情况,这种情况需要Qualifier来解决
定义一个Car接口:
public interface ICar {
String getCarName();
}
两个实现类BMWCar和BenzCar:
@Component("benzCar")
public class BenzCar implements ICar {
@Override
public String getCarName() {
return "奔驰";
}
}
@Component("bmwCar")
public class BMWCar implements ICar {
@Override
public String getCarName() {
return "宝马";
}
}
工厂类:
@Component("cf")
public class CarFactory {
@Autowired
private ICar iCar;
public String toString(){
return iCar.getCarName();
}
}
很明显这种写法会报错,
No unique bean of type [com.spring.service.ICar] is defined: expected single matching bean but found 2: [bmwCar, benz]
很明显这种写法会报错,因为Spring并不知道应当引用哪个实现类,这个时候使用@Qualifie
@Autowired
@Qualifier("bmwCar")
private ICar iCar;
结果:宝马
4.2 @Resource
@Resource注解与@Autowired注解作用非常相似,这个就简单说了,看例子:
@Resource(type = BenzCar.class)
private ICar iCar2; @Resource(name = "benzCar")
private ICar iCar3;
五、常用注解总结
最后介绍常用的注解
@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了
@Bean,就会作为这个Spring容器中的Bean。
@Scope注解 作用域 @Lazy(true) 表示延迟初始化
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定scope作用域的(用在类上)
@PostConstruct用于指定初始化方法(用在方法上)
@PreDestory用于指定销毁方法(用在方法上)
@DependsOn:定义Bean初始化及销毁时的顺序
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常 @Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下: @Autowired @Qualifier("personDaoBean") 存在多个实例配合使用 @Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
@PostConstruct 初始化注解
@PreDestroy 摧毁注解 默认 单例 启动就加载
@Async异步方法调用
Spring之旅第四篇-注解配置详解的更多相关文章
- spring基于通用Dao的多数据源配置详解【ds1】
spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种 ...
- Spring MVC配置文件的三个常用配置详解
转自:http://www.cnblogs.com/benwu/articles/5162614.html Spring MVC项目中通常会有二个配置文件,sprng-servlet.xml和appl ...
- spring框架中AOP思想与各种配置详解
Spring中提供两种AOP支持: 1.基于代理的经典AOP 2.Aspectj注解配置AOP 首先我们先了解什么是AOP,AOP(Aspect Oriented Programming ...
- DAX 第四篇:CALCULATE详解
CALCULATE()函数是DAX中最复杂的函数,用于计算由指定过滤器修改的上下文中的表达式. CALCULATE(<expression>,<filter1>,<fil ...
- Spring Boot中使用MyBatis注解配置详解(1)
之前在Spring Boot中整合MyBatis时,采用了注解的配置方式,相信很多人还是比较喜欢这种优雅的方式的,也收到不少读者朋友的反馈和问题,主要集中于针对各种场景下注解如何使用,下面就对几种常见 ...
- Spring Boot教程(三十八)使用MyBatis注解配置详解(1)
之前在Spring Boot中整合MyBatis时,采用了注解的配置方式,相信很多人还是比较喜欢这种优雅的方式的,也收到不少读者朋友的反馈和问题,主要集中于针对各种场景下注解如何使用,下面就对几种常见 ...
- Spring Boot中使用MyBatis注解配置详解
传参方式 下面通过几种不同传参方式来实现前文中实现的插入操作. 使用@Param 在之前的整合示例中我们已经使用了这种最简单的传参方式,如下: @Insert("INSERT INTO US ...
- Spring Boot教程(三十九)使用MyBatis注解配置详解(2)
增删改查 MyBatis针对不同的数据库操作分别提供了不同的注解来进行配置,在之前的示例中演示了@Insert,下面针对User表做一组最基本的增删改查作为示例: public interface U ...
- 从Spring到SpringBoot构建WEB MVC核心配置详解
目录 理解Spring WEB MVC架构的演变 认识Spring WEB MVC 传统时代的Spring WEB MVC 新时代Spring WEB MVC SpringBoot简化WEB MVC开 ...
随机推荐
- golang 通过exec Command启动的进程如何关闭的解决办法 以及隐藏黑色窗口
golang 通过exec Command启动的进程如何关闭的解决办法 在用exec包调用的其他进程后如何关闭结束,可以使用context包的机制进行管理,context包的使用详见:https:// ...
- 【强连通分量+概率】Bzoj2438 杀人游戏
Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是 ...
- BZOJ_4873_[Shoi2017]寿司餐厅_最大权闭合子图
BZOJ_4873_[Shoi2017]寿司餐厅_最大权闭合子图 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4873 分析:我们发现分数正负 ...
- 基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(一)
作品已经完成,先上源码: https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip 全文包含三篇,这是第一篇,作为前言和概述. 第二篇:基于Oran ...
- Keras框架简介
Keras是基于Theano的一个深度学习框架,它的设计参考了Torch,用Python语言编写,是一个高度模块化的神经网络库,支持GPU和CPU.使用文档在这:http://keras.io/,中文 ...
- 在ASP.NET Core中给上传图片功能添加水印
在传统的.NET框架中,我们给图片添加水印有的是通过HttpModules或者是HttpHandler,然后可以通过以下代码添加水印: var image = new WebImage(imageBy ...
- 性能测试入门 — LoadRunner 使用初探
前言: 性能测试是利用产品.人员和流程来降低应用程序.升级程序或补丁程序部署风险的一种手段.性能测试的主要思想是通过模拟产生真实业务的压力对被测系统进行加压,验证被测系统在不同压力情况下的表现,找出其 ...
- SpringBoot进阶教程(二十四)整合Redis
缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力.Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非 ...
- Asp.Net Core&Docker部署到树莓派3B中
花了一点时间将吃灰数月的树莓派装上了Docker,并在容器中部署了一个Asp.Net Core应用程序,通过花生壳映射树莓派中的程序,可以使用外网访问树莓派,玩起来很有意思(外网访问地址:http:/ ...
- 中小研发团队架构实践之分布式协调器ZooKeeper
一.ZooKeeper是什么 Apache ZooKeeper是由Apache Hadoop的子项目发展而来,于2010年11月正式成为了Apache的顶级项目. ZooKeeper是一个开放源代码 ...