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 ...
随机推荐
- QTreeWidget 获取被双击的子项的层次路径
from PyQt5.QtWidgets import (QApplication, QWidget, QHBoxLayout, QTreeWidget, QTreeWidgetItem, QGrou ...
- 开启mysql日志及若干问题
今天学习了mysql日志功能,以前也有所了解,只不过没有深入的学习,所以趁着“余热”,把我从网上找到的资料与实践 结合起来,总结一下其基本用法.学习从来都不是无趣的,就看你怎么看待学习. 1.查看查询 ...
- LAMP环境如何配置多个域名访问
背景: 公司有多个项目想要挂载在一个服务器上,因此需要多个域名来访问不同的网站,其实就是一个阿里云服务器,一个ip对应于多个域名 lamp环境: centos版本:命令查看centos的版本号:rpm ...
- windows 2003 发布遇到问题---分析器错误消息: 未能加载类型“YWPT.MvcApplication”。
问题如下: “/”应用程序中的服务器错误. ------------------------------------------------------------------------------ ...
- WebApi 异常处理解决方案
1.继承ExceptionFilterAttribute类,重写OnException方法 public class WebApiExceptionFilterAttribute : Exceptio ...
- GIS Cesium地图数据配置
1.打开IIS,点击站点 2.跨域配置 配置方式: 在地图数据目录之中放置web.config文件,里面存放 <?xml version="1.0" encoding=&qu ...
- ArcGIS ArcMap 与 ArcServer关于Python的冲突
一.问题描述 1.ArcMap 是32位,运行的Python也是32位: 2.ArcGIS Server 是64位,运行的Python是64位: 3.这样就导致注册表和环境变量起冲突,即如果Serve ...
- Android Studio添加assets文件夹
Step #1:调出项目结构管理区域 View->Tool Windows->Project Step #2:结构管理区域选择“Project” Step #3:新建"asset ...
- hdu 1300(dp)
一个模式的dp. Pearls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- will-change
目的: 让GPU分担CPU的工作,从而优化和分配内存,告知浏览器做好动画的准备. 背景: 注意事项: 1,will-change虽然可以加速,但是,一定一定要适度使用: 2,使用伪元素,独立渲染: 不 ...