Spring IOC容器入门(三)

Spring IOC容器的(一)和(二)主要介绍的是Spring IOC的入门使用方法,在实际工作中,Spring通常会使用注解的方式来去掉部分或者全部xml配置,下面介绍一下在Spring中应该如何使用注解来替代xml。

根据Spring对bean对象的管理功能,它提供了四种注解:

  • 用于创建对象的注解:xml中的bean标签

  • 用于注入属性的注解:xml的property标签

  • 用于改变bean作用范围的注解:xml中的scope属性

  • 管理bean生命周期的注解:xml的中init-method属性

Spring使用注解时,需要修改xml的命名空间,并且增加一个配置,告诉spring在创建容器的时候,需要到扫描的包,只有在所配置包的里面的类,spring才会去解析这些类上的注解。

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
   <context:component-scan base-package="com.ws"/>
</beans>

创建bean注解

@Component(value=“test”)注解
该注解的作用就是创建一个配置了该注解的类的一个对象,把他放到spring容器中,这个对象的id就是这个test,这个注解value是可以不需要配置的,如果不配,那么默认使用类的名称,且第一个字母小写。

下面介绍一下Component注解衍生注解,这三个注解的作用和属性与Component注解一样。定义三个注解主要是更清楚的描述相应业务
@Controller 一般用在表现层
@Service 一般用在业务层
@Repository 一般用在持久层

属性注入注解

@Autowired
该注解可以用在属性上,也可以用在方法上,这个注解的原理是首先获取从spring容器中查找与需要注入属性类型相同的bean,如果找到唯一的一个bean,那么就把这个bean注入到该属性上,如果找到的两个类型符合的bean,然后接着去判断这两个类型相同的bean的id的名称哪个与需要注入的属性的名称相同,如果找到就把此bean注入到属性中,如果没有找到那么就报错,使用Autowired注解,不需要提供set方法。
@Qualifier
该注解的作用是在确定了注入类型的情况下,根据bean的ID来注入,它别和Autowired配合使用,由Autowired注解寻找类型,再由Qualifier注解寻找id,具体使用如下: Qualifier的value值表示需要把beanID=ud的bean注入到userDao属性中。

@Autowired
@Qualifier(value = "ud")
private UserDao userDao;

@Resource
由于Qualifier注解需要和Autowired配合使用,因此不方便,spring由提供了一个注解,直接安装bean的id注入。Resource注解的属性不是value而是叫name。

上面的三个注解都是只能注入bean,而基本类型和String的属性需要通过@Value注解注入,集合类型不能通过注解方式注入,只能通过xml方式。

Bean作用范围的注解

@Scope(“prototype”)
采用注解方式创建bean的默认情况下是单例,如果在类上加上@Scope(“prototype”)注解,那么创建的bean就是多例。

Bean生命周期

@PostConstruct
该注解用在方法上,表示对象创建后执行的方法
@PreDestroy
该注解用在方法上,表示bean销毁前执行的方法

上面注解引入方式仍然需要依靠xml配置文件,Spring提供了新的注解,用来替代xml文件。
@Configuration
该注解作用在java类上,表示所修饰的类是一个配置类,相当于xml文件
@ComponentScan
该注意是用来表明spring容器扫描的java包,作用相当于在xml文件配置:

<context:component-scan base-package="com.ws"/>

通常两个注解配合在一起是使用。

@Configuration
@ComponentScan(basePackages = "com.ws.springtest")
public class SpringConf {

}

@Bean
在配置类中定义相应的方法,方法上加上@Bean注解,创建bean,相当于xml中定义bean标签。

@Bean(name="userService")
@Scope("prototype")
public UserService userService(){
    return new UserServiceImpl();
}

@Bean注解如果没有配置value属性,那么创建的bean就以@Bean修饰的方法的名称作为Spring IOC容器创建bean的ID,如果在@Bean修饰的方法上增加@Scope注解,可以控制创建的bean是否是单例,还是多例。
当使用注解的方法来替代xml文件的时候,那么需要调用如下的方式来启动Spring IOC容器:

ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConf.class);

SpringConf.class就是用@Configuration注解修饰的类。
-- 注意:当创建AnnotationConfigApplicationContext对象是,把SpringConf.class传入到AnnotationConfigApplicationContext时,那么SpringConf类上的@Configuration注解可以省略,因为,使用这种方式Spring会自动去读取传入到AnnotationConfigApplicationContext构造方法的类的信息,会把它当成配置类。AnnotationConfigApplicationContext的构造方法的参数是可变参数,因此可以给它传入多个配置类。只要是传入到它的构造方法中的配置类,那么都不需要在类到的上面增加@Configuration注解,此时这些配置类也不需一定要在@ComponentScan注解所扫描的包里。

@Bean注解修饰的方法如果有参数,那么参数的注入是根据参数的类型到IOC容器中寻找相关的类型的bean,注入到方法的参数中。如果在IOC容器中有类型相同的两个bean,那么就去检查方法参数的名称与哪个bean的id相同,就用哪个bean注入,否则就会报错,为了避免这种错误,可以通过@Qualifier注解来解决这个问题:

@Bean(name="userService")
public UserService userService(@Qualifier("ds1") DataSource dataSource){
    return new UserServiceImpl();
}

用@Qualifier注解来指定需要注入的bean的ID。

@Import注解
在使用代码实现spring的bean配置的时候,有时候需要创建多个配置类,每一个配置类完成相应的配置工作。那么,spring如何读取这些配置类呢?
1.把这些配置类传入到AnnotationConfigApplicationContext的构造方法中。此时这些配置类的关系是兄弟关系
2.在配置类上在增加@Configuration注解,并且该配置类必须放在@ComponentScan注解所扫描的包里
2.创建一个主配置类,在主配置类采用1或者2的方式创建,然后通过@Import注解导入其他配置类。这种方式,凡是使用@Import导入的配置类与主配置类就是个父子关系。使用@Import导入的类,既不需要配置@Configuration注解,也不需要把类放置到@ComponentScan注解所扫描的包里。

下面介绍最后两个注解:@PropertySource和@Value
该注解的作用就是读取properties文件,通过@PropertySource把相应路径下的properties文件读到spring容器中,然后通过@Value注解来获取properties文件中的相关key-value值。具体如下:

@PropertySource("classpath:jdbc.properties")
public class JDBCConf {

    @Value("${jdbc.uname}")
    private String username;

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.passwd}")
    private String password;
}

其中${} 里的值是properties文件中的key。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • 转 Spring****基于 Annotation 的简单介绍 2011年03月29日 15:07:00 阅读数:...
    fd649cf896c0阅读 344评论 1 0
  • 本来是准备看一看Spring源码的。然后在知乎上看到来一个帖子,说有一群**自己连Spring官方文档都没有完全读...
    此鱼不得水阅读 6,928评论 4 21
  • 25个经典的Spring面试问答 本人收集了一些在大家在面试时被经常问及的关于Spring的主要问题,这些问题有可...
    杀小贼阅读 694评论 0 2
  • 参考W3C Spring教程 Spring致力于J2EE应用的各种解决方案,而不仅仅专注于某一层解决方案。可以说S...
    王侦阅读 1,158评论 0 6
  • 2018年10月38周岁,眼睛肿肿的快8点了才起床,小宝还没醒看来今天幼儿园的早餐又错过了。我是两个孩子的妈妈了,...
    玛格丽威阅读 136评论 0 2