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 ...
随机推荐
- Stochastic Multiple Choice Learning for Training Diverse Deep Ensembles
作者提出的方法是Algotithm 2.简单来说就是,训练的时候,在几个模型中,选取预测最准确的(也就是loss最低的)模型进行权重更新.
- 用 malloc 或 new 申请内存之后,应该立即检查指针值是否为 NULL
用 malloc 或 new 申请内存之后,应该立即检查指针值是否为 NULL. 防止使用指针值为 NULL 的内存. #include <iostream> #include <s ...
- php -- 四种基础排序:冒泡、选择、插入、快速
冒泡排序 思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来. 第一轮:从第一个到最后一个冒泡比较,运行结果:最后一个最大 第二轮:从第一个到倒数第二个冒泡比较, 运行结果:最后一 ...
- 【BZOJ】1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路(floyd)
http://www.lydsy.com/JudgeOnline/problem.php?id=1624 一开始我打算一个个最短路................................. 然 ...
- 蓝桥杯 历届试题 剪格子(dfs搜索)
历届试题 剪格子 时间限制:1.0s 内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |* || +--****--+ ||* | ** ...
- Ubuntu Mysql 安装
下载 http://dev.mysql.com/downloads/mysql/ 选择 Linux- Generic 选择版本 wget http://cdn.mysql.com/Downloads/ ...
- WebStorm Cordova 环境搭建
一.软件安装 1.nodejs 2.npm 3.Cordova 如果慢,可以修改镜像,再进行安装. npm config set registry http://registry.cnpmjs.org ...
- leetcode -- Best Time to Buy and Sell Stock III TODO
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- leetcode -- Permutations II TODO
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
- js中什么是闭包?
闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.