Spring框架第四篇之基于注解的DI注入
一、说明
与@Component注解功能相同,但意义不同的注解还有三个:
1)@Repository:注解在Dao实现类上
2)@Service:注解在Service实现类上
3)@Controller:注解在SpringMVC的处理器上
Bean作用域:
@Scope("prototype"):用于指定对象创建模式,可以是单例模式或者原型模式,默认是singleton
基本类型属性注入:
@Value
@Autowired:byType方式的注解式注入,即根据类型注解
@Qualifier("mySchool"):byName方式的注解式注入,在使用@Qualifier时必须与@Autowired联合使用
域属性注解:
@Resource:不加name属性则为byType方式的注解式注入,但前提是注入的对象只能有一个
@Resource(name="mySchool"):byName方式的注解式注入
Bean的生命始末:
@PostConstruct:当前Bean初始化刚完毕
@PreDestroy:当前Bean即将被销毁
@Configuration:表示当前类充当Spring容器,即所有的Bean将由这个类来创建
注意:
在举例之前声明几个问题:
1、注解需要依赖spring-aop-4.3.9.RELEASE.jar包,所以需要导入依赖包。

2、使用注解方式注入,配置文件需要添加约束头文件:
<?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">
也可以自己从Spring的说明文档中找到此头文件:

3、如果使用到了SpringJUnit4测试,则还需要导入spring-test-4.3.9.RELEASE.jar包
二、举例
1、首先创建一个School类:
package com.ietree.spring.basic.annotation.demo1; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; @Component("mySchool")
public class School { @Value(value = "清华大学")
private String name; public School() {
super();
} public School(String name) {
super();
this.name = name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "School [name=" + name + "]";
} }
创建Student类:
package com.ietree.spring.basic.annotation.demo1; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; /**
* 说明:
* 与@Component注解功能相同,但意义不同的注解还有三个:
* 1)@Repository:注解在Dao实现类上
* 2)@Service:注解在Service实现类上
* 3)@Controller:注解在SpringMVC的处理器上
*
* Bean作用域:
* @Scope("prototype"):用于指定对象创建模式,可以是单例模式或者原型模式,默认是singleton
*
* 基本类型属性注入:
* @Value
*
* @Autowired:byType方式的注解式注入,即根据类型注解
* @Qualifier("mySchool"):byName方式的注解式注入,在使用@Qualifier时必须与@Autowired联合使用
*
* 域属性注解:
* @Resource:不加name属性则为byType方式的注解式注入,但前提是注入的对象只能有一个
* @Resource(name="mySchool"):byName方式的注解式注入
*
* Bean的生命始末:
* @PostConstruct:当前Bean初始化刚完毕
* @PreDestroy:当前Bean即将被销毁
*/
//@Scope("prototype")
@Component("myStudent")
public class Student { @Value(value = "小明")
private String name; @Value(value = "25")
private int age; // @Autowired
// @Qualifier("mySchool")
// @Resource(name="mySchool")
@Resource
private School school;// 对象属性,也叫做域属性 public Student() {
super();
} public Student(String name, int age) {
super();
this.name = name;
this.age = age;
} public void setName(String name) {
System.out.println("执行setName()");
this.name = name;
} public void setAge(int age) {
System.out.println("执行setAge()");
this.age = age;
} public void setSchool(School school) {
this.school = school;
} @Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", school=" + school + "]";
} @PostConstruct
public void initAfter(){
System.out.println("当前Bean初始化刚完毕");
} @PreDestroy
public void preDestroy(){
System.out.println("当前Bean即将被销毁");
}
}
创建MyJavaConfig类:
package com.ietree.spring.basic.annotation.demo1; import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* @Configuration:表示当前类充当Spring容器,即所有的Bean将由这个类来创建
*/
@Configuration
public class MyJavaConfig { @Bean(name="mySchool")
public School mySchoolCreator(){
return new School("清华大学");
} // autowire=Autowire.BY_TYPE:指从当前类这个容器中查找与域属性的类型具有is-a关系的Bean
// autowire=Autowire.BY_NAME:指从当前类这个容器中查找与域属性同名的Bean
@Bean(name="myStudent", autowire=Autowire.BY_TYPE)
public Student myStudentCreator(){
return new Student("小明", 25);
}
}
创建配置文件:
<?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"> <!-- 扫描 com.ietree.spring.basic.annotation.demo1这个包及其子包 -->
<context:component-scan base-package="com.ietree.spring.basic.annotation.demo1"/> <!-- 扫描 com.ietree.spring.basic这个包的子包 -->
<context:component-scan base-package="com.ietree.spring.basic.*"/> </beans>
创建测试类:
package com.ietree.spring.basic.annotation.demo1; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:com/ietree/spring/basic/annotation/demo1/applicationContext.xml")
public class MyTest { @Autowired
private Student student; @Test
public void test01() { String resource = "com/ietree/spring/basic/annotation/demo1/applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(resource); School school = (School) ctx.getBean("mySchool");
System.out.println(school); Student student = (Student) ctx.getBean("myStudent");
System.out.println(student); ((ClassPathXmlApplicationContext)ctx).close();
} public void test02(){
System.out.println(student);
} }
注意:如果配置了XML,同时又配置了注解,那么程序会首先选择XML配置创建对象。
Spring框架第四篇之基于注解的DI注入的更多相关文章
- Spring框架第三篇之基于XML的DI注入
一.注入分类 Bean实例在调用无参构造器创建空值对象后,就要对Bean对象的属性进行初始化.初始化是由容器自动完成的,称为注入.根据注入方式的不同,常用的有两类:设值注入.构造注入.实现特定接口注入 ...
- SSM-Spring-07:Spring基于注解的di注入
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 注解: 说起注解,哇哦,每个人都或多或少的用到过 像什么@Overried,@Test,@Param等等之前就 ...
- 07 Spring框架 依赖注入(四)基于注解的依赖注入
前面几节我们都在使用xml进行依赖的注入,但是在实际的开发中我们往往偏爱于使用注解进行依赖注入,因为这样更符合我们人的思维,并且更加快捷,本节就来讲述Spring基于注解的依赖注入: 信息注入注解 @ ...
- Spring的第四天AOP之注解版
Spring的第四天AOP之注解版 ssm框架 spring 在上一篇博客中,介绍了Spring的AOP的xml版本的使用,在这篇博客中,我将介绍一下,注解版的使用. 常用注解 注解 通知 @Aft ...
- Spring声明式事务管理(基于注解方式实现)
----------------------siwuxie095 Spring 声明式事务管理(基于注解方式实现) 以转 ...
- 解决Spring框架的Dao层改用@Repository注解,无法使用JdbcDaoSupport的问题
解决Spring框架的Dao层改用@Repository注解,无法使用JdbcDaoSupport的问题 Alternatively, create an own implementation of ...
- 使用Spring框架入门四:基于注解的方式的AOP的使用
一.简述 前面讲了基于XML配置的方式实现AOP,本文简单讲讲基于注解的方式实现. 基于注解的方式实现前,要先在xml配置中通过配置aop:aspectj-autoproxy来启用注解方式注入. &l ...
- spring框架学习(四)——注解方式AOP
注解配置业务类 使用@Component("s") 注解ProductService 类 package com.how2java.service; import org.spri ...
- Spring Cloud第四篇 | 客户端负载均衡Ribbon
本文是Spring Cloud专栏的第四篇文章,了解前三篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...
随机推荐
- CI $_GET
CI默认过滤了$_GET 需要传递get参数时一般直接 /参数一/参数二 详见手册说明:http://codeigniter.org.cn/user_guide/general/controllers ...
- CSS旋转&翻转,兼容方案
CSS代码,高级浏览器使用transform,ie用滤镜实现. 转自http://aijuans.iteye.com/blog/19364921 /*水平翻转*/ 2 .flipx { 3 -moz- ...
- C# 布局 Anchor&Dock
编写c#的时候,希望里面的空间能够随窗口的改变自动调整大小.就需要用到Anchor和Dock属性. 参考链接: http://www.cnblogs.com/yuyijq/archive/2010/0 ...
- 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...
- JavaScript有关的10个怪癖和秘密(转)
数据类型和定义 -------------------------------------------------------------------------------------------- ...
- 1 week110的zookeeper的安装 + zookeeper提供少量数据的存储
随时查看,zookeeper企业里公认的最新文档版本! https://archive.apache.org/dist/ 下面是在weekend110上的zookeeper的安装 在 ...
- 怎样使用DWZ?
首先说明,这篇文章不是解说DWZ内部实现原理的,也不打算分析它的源代码,这里仅仅是演示一下,怎样将DWZ框架整合到项目中去. 刚刚过去的项目中,前台UI使用的是DWZ.因为之前项目的开发环境都已经搭建 ...
- __file__
__file__ 是 python 的内置变量它的值等于文件名本身 [root@localhost ~]$ cat test.py #!/usr/bin/env python print(__file ...
- java基础---->Java中异常的使用(二)
这一篇博客用例子讲述一下异常的处理过程.那些 我们一直惴惴不安 又充满好奇的未来 会在心里隐隐约约地觉得它们是明亮的. 异常的执行过程 一.实例一:return语句 public class Exce ...
- mac java环境
1.java运行环境jre:http://www.java.com/zh_CN/ 2.jdk:http://www.oracle.com/technetwork/java/javase/downloa ...