一、引言

最近因为找工作,导致很长时间没有更新,找工作的时候你会明白浪费的时间后面都是要还的,现在的每一点努力,将来也会给你回报的,但行好事,莫问前程!努力总不会有错的。

上一篇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之旅第四篇-注解配置详解的更多相关文章

  1. spring基于通用Dao的多数据源配置详解【ds1】

    spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种 ...

  2. Spring MVC配置文件的三个常用配置详解

    转自:http://www.cnblogs.com/benwu/articles/5162614.html Spring MVC项目中通常会有二个配置文件,sprng-servlet.xml和appl ...

  3. spring框架中AOP思想与各种配置详解

    Spring中提供两种AOP支持:   1.基于代理的经典AOP   2.Aspectj注解配置AOP    首先我们先了解什么是AOP,AOP(Aspect Oriented Programming ...

  4. DAX 第四篇:CALCULATE详解

    CALCULATE()函数是DAX中最复杂的函数,用于计算由指定过滤器修改的上下文中的表达式. CALCULATE(<expression>,<filter1>,<fil ...

  5. Spring Boot中使用MyBatis注解配置详解(1)

    之前在Spring Boot中整合MyBatis时,采用了注解的配置方式,相信很多人还是比较喜欢这种优雅的方式的,也收到不少读者朋友的反馈和问题,主要集中于针对各种场景下注解如何使用,下面就对几种常见 ...

  6. Spring Boot教程(三十八)使用MyBatis注解配置详解(1)

    之前在Spring Boot中整合MyBatis时,采用了注解的配置方式,相信很多人还是比较喜欢这种优雅的方式的,也收到不少读者朋友的反馈和问题,主要集中于针对各种场景下注解如何使用,下面就对几种常见 ...

  7. Spring Boot中使用MyBatis注解配置详解

    传参方式 下面通过几种不同传参方式来实现前文中实现的插入操作. 使用@Param 在之前的整合示例中我们已经使用了这种最简单的传参方式,如下: @Insert("INSERT INTO US ...

  8. Spring Boot教程(三十九)使用MyBatis注解配置详解(2)

    增删改查 MyBatis针对不同的数据库操作分别提供了不同的注解来进行配置,在之前的示例中演示了@Insert,下面针对User表做一组最基本的增删改查作为示例: public interface U ...

  9. 从Spring到SpringBoot构建WEB MVC核心配置详解

    目录 理解Spring WEB MVC架构的演变 认识Spring WEB MVC 传统时代的Spring WEB MVC 新时代Spring WEB MVC SpringBoot简化WEB MVC开 ...

随机推荐

  1. Connection reset by peer的常见原因

    1,如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer). Socket默认连接60秒 ...

  2. 干货 | Java中获取类名的3种方法!

    获取类名的方法 Java 中获取类名的方式主要有以下三种. getName() 返回的是虚拟机里面的class的类名表现形式. getCanonicalName() 返回的是更容易理解的类名表示. g ...

  3. kv.go

    package clientv3 import (     pb "github.com/coreos/etcd/etcdserver/etcdserverpb" //protob ...

  4. 如果裸写一个goroutine pool

    引言 在上文中,我说到golang的原生http server处理client的connection的时候,每个connection起一个goroutine,这是一个相当粗暴的方法.为了感受更深一点, ...

  5. BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP

    BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP Description 正如你所知,奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺 ...

  6. BZOJ_1861_[Zjoi2006]Book 书架_splay

    BZOJ_1861_[Zjoi2006]Book 书架_splay 题意: 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在 ...

  7. Java开源生鲜电商平台-通知模块设计与架构(源码可下载)

    Java开源生鲜电商平台-通知模块设计与架构(源码可下载) 说明:对于一个生鲜的B2B平台而言,通知对于我们实际的运营而言来讲分为三种方式:           1. 消息推送:(采用极光推送)   ...

  8. eclipse使用Git基本流程

    1.安装GIT 2.Git的使用 ①下载代码到eclipse(右键导入工程) ②提交代码到本地(commit) ③更新代码到本地(pull) ④当本地出现冲突时,解决冲突,没有冲突当然就最好啦 ⑤提交 ...

  9. 【工具篇】抓包中的王牌工具—Fiddler (1-环境搭建)

    导言 在现在高速发展的互联网时代,抓包工具被广泛应用在软件开发的项目中,Fiddler可谓是当下主流的抓包工具之一.测试人员用它来抓包.回放测试记录,构造发包测试用例,开发人员用来定位问题,其强大的功 ...

  10. ES6语法的学习与实践

    ES6是JavaScript语言的新一代标准,是ECMAScript的第六个版本,加入了很多新的功能和语法,在很多框架,如在使用Vue,React等框架的项目中一般都采用ES6语法来编写的,下面对经常 ...