Spring多种方式实现依赖注入
平常的Java开发中,程序员在某个类中需要依赖其它类的方法。
通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理。
Spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过Spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。
依赖注入的另一种说法是"控制反转"。通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员。
而控制反转是指new实例工作不由我们程序员来做而是交给Spring容器来做。
1.Set注入
构建一个Student对象
package cn.happy.entity; /**
* Created by CKW on 2017/3/19.
*/
public class Student {
private String sname;
private Integer sage; public Integer getSage() {
return sage;
} public void setSage(Integer sage) {
this.sage = sage;
} public String getSname() {
return sname;
} public void setSname(String sname) {
this.sname = sname;
} }
在配置applicationContext.xml中:
<!--set 注入 prototype 原型 singletion 单例-->
<bean id="stu" class="cn.happy.entity.Student" scope="prototype">
<property name="sname" value="张三"></property>
<property name="sage" value=""></property>
</bean>
测试类中:
//被Spring管理的bean默认都是单例的
@Test
public void myTest1(){
//ac 就是Spring容器
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
Student stu=(Student) ac.getBean("stu");
Student stu1=(Student) ac.getBean("stu");
System.out.println(stu+"\n"+stu1);
}
2.构造器注入
在对象中添加构造
配置中:
<!--构造注入-->
<bean id="car1" class="cn.happy.entity.Car">
<property name="cname" value="图驴子"></property>
</bean>
<bean id="stu1" class="cn.happy.entity.Student">
<!--()创建构造器注入,如果主类有带参的构造方法则需添加此配置-->
<constructor-arg index="" value="哇哈哈"></constructor-arg>
<constructor-arg index="" value=""></constructor-arg>
<constructor-arg index="" ref="car1"></constructor-arg>
</bean>
测试类:
//构造注入
@Test
public void myTest2(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
Student stu1=(Student) ac.getBean("stu1");
Student stu2=(Student) ac.getBean("stu2");
System.out.println("构造:"+stu1); }
3.空间命名注入
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!--命名空间P注入-->
<bean id="car2" class="cn.happy.entity.Car">
<property name="cname" value="毛驴"></property>
</bean>
<bean id="stu2" class="cn.happy.entity.Student" p:sname="李四" p:sage="" p:car-ref="car2"></bean>
//构造注入 命名空间注入
@Test
public void myTest2(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
Student stu1=(Student) ac.getBean("stu1");
Student stu2=(Student) ac.getBean("stu2");
System.out.println("构造:"+stu1+"\n命名空间:"+stu2); }
4.集合注入
<!--list集合属性注入-->
<bean id="collection1" class="cn.happy.entity.MyCollection">
<property name="list">
<list>
<value>哈哈</value>
<value>呵呵</value>
<value>嘿嘿</value>
</list>
</property>
</bean> <!--set集合属性注入-->
<bean id="collection2" class="cn.happy.entity.MyCollection">
<property name="set">
<set>
<value>哈哈</value>
<value>呵呵</value>
<value>嘿嘿</value>
</set>
</property>
</bean> <!--Map集合属性注入-->
<bean id="collection3" class="cn.happy.entity.MyCollection">
<property name="map">
<map>
<entry key="">
<value>呵呵</value>
</entry>
<entry key="">
<value>哈哈</value>
</entry>
<entry key="">
<value>嘿嘿</value>
</entry>
</map>
</property>
</bean>
5.注解注入
package cn.happy.entity; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service; /**
* Created by CKW on 2017/3/22.
*/
@Component("car") //不分层
/*@Repository //dao层*/
/*@Service //biz层*/
/*@Controller //action层*/
public class Car {
@Value("特斯拉")
private String cname; @Override
public String toString() {
return getCname();
} public Car() {
} public Car(String cname) {
this.cname = cname;
} public String getCname() {
return cname;
} public void setCname(String cname) {
this.cname = cname;
}
}
package cn.happy.entity; 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; import javax.annotation.Resource; /**
* Created by CKW on 2017/3/22.
*/ @Component("student")
public class Student {
@Value("撒打发")
private String sname;
@Value("")
private Integer sage;
//jdk注解
// @Resource
@Autowired
@Qualifier("car")
private Car car; @Override
public String toString() {
return "name="+getSname()+",age="+getSage()+",car="+getCar();
} public Car getCar() {
return car;
} public void setCar(Car car) {
this.car = car;
} public Student() { } public String getSname() {
return sname;
} public Student(String sname, Integer sage, Car car) {
this.sname = sname;
this.sage = sage;
this.car = car;
} public void setSname(String sname) {
this.sname = sname;
} public Integer getSage() {
return sage;
} public void setSage(Integer sage) {
this.sage = sage;
}
}
在配置applicationContext.xml中:
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<!--注解-->
<!--配置包扫描器-->
<context:component-scan base-package="cn.happy.entity"></context:component-scan>
测试类:
//注解
@Test
public void myTest4(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
Student stu=(Student)ac.getBean("student");
System.out.println(stu.getCar().getCname());
}
Spring多种方式实现依赖注入的更多相关文章
- Spring——多种方式实现依赖注入
在Spring的XML配置中,只有一种声明bean的方式:使用<bean>元素并指定class属性.Spring会从这里获取必要的信息来创建bean. 但是,在XML中声明DI时,会有多种 ...
- IOC和AOP使用扩展 多种方式实现依赖注入
多种方式实现依赖注入 1.Spring 使用setter访问器实现对属性的赋值, 2.Spring 构造constructor方法赋值, 3.接口注入 4.Spring P命名空间注入直接量 sett ...
- Spring - lookup-method方式实现依赖注入
引言 假设一个单例模式的bean A需要引用另外一个非单例模式的bean B,为了在我们每次引用的时候都能拿到最新的bean B,我们可以让bean A通过实现ApplicationContextWa ...
- 多种方式实现依赖注入及使用注解定义bean
构造注入 如何给构造方法中的参数注入方法呢如下 首先bean代码如下 package cn.pojo; public class Greeting { /** * 说的话 */ private Str ...
- Ioc和Aop扩展--多种方式实现依赖注入(构造注入,p命名空间注入,集合类型注入,注入null和注入空值)
构造注入 语法: <constructor-arg> <ref bean="bean的id"/> </constructor-arg> 1 ...
- Spring源码剖析依赖注入实现
Spring源码剖析——依赖注入实现原理 2016年08月06日 09:35:00 阅读数:31760 标签: spring源码bean依赖注入 更多 个人分类: Java 版权声明:本文为博主原 ...
- (转)Spring读书笔记-----Spring核心机制:依赖注入
Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因此,我们说这些对象间存在依赖关系.加入A组件调用了B组件的方法,我们就 ...
- 回客科技 面试的 实现ioc 容器用到的技术,简述BeanFactory的实现原理,大搜车面试的 spring 怎么实现的依赖注入(DI)
前言:这几天的面试,感觉自己对spring 的整个掌握还是很薄弱.所以需要继续加强. 这里说明一下spring的这几个面试题,但是实际的感觉还是不对的,这种问题我认为需要真正读了spring的源码后说 ...
- ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
ExpandoObject与DynamicObject的使用 using ImpromptuInterface; using System; using System.Dynamic; names ...
随机推荐
- 洛谷P1228 地毯填补问题
P1228 地毯填补问题 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站 ...
- 洛谷P3688/uoj#291. [ZJOI2017]树状数组
传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...
- PostgreSQL - raise函数打印字符串
raise函数 在PostgreSQL中,该函数用于打印字符串,类似于Java中的System.out.println(),Oracle中的dbms_output.put_line(). 用法如下: ...
- NET Core 2.0 的 REST API
用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) + 准备项目 上一部分预备知识在这 http://www.cnblogs.com/cgzl/p/9010978 ...
- (转)Centos 7.3 用户和组管理
Centos 7.3 用户和组管理 原文:http://blog.csdn.net/github_39069288/article/details/73306489 3.1 用户和密码配置文件 pas ...
- TDH-search汇报理解
题目:海量数据查询开头:1.自我介绍:2.题目切入: 什么是海量数据查询?(海量数据,快速,符合要求) 几个常用场景(搜索引擎,百度:话单查询:影像平台,高铁)3.展示目录:架构,案例,平台规划 4. ...
- ms sqlserver 登录失败 错误:4064
无法打开用户默认数据库.登录失败.用户‘sa’登录失败.(Microsoft SQL Server, 错误:4064) 解决方法:解决方法:先用windows身份验证的方式登录进去,然后在 安全性=& ...
- 机器学习框架ML.NET学习笔记【5】多元分类之手写数字识别(续)
一.概述 上一篇文章我们利用ML.NET的多元分类算法实现了一个手写数字识别的例子,这个例子存在一个问题,就是输入的数据是预处理过的,很不直观,这次我们要直接通过图片来进行学习和判断.思路很简单,就是 ...
- 次小生成树(SST)
次小生成树(SST) 题目背景 Awson是某国际学校信竞组的一只菜鸡.Awson最近学了很多最小生成树的算法,Prim算法.Kurskal算法.消圈算法等等.正当Awson洋洋得意之时,信竞组其他大 ...
- 《Ionic 2 实例开发》发布
Ionic 2系列教程集结成册,在百度阅读上架发布,名为<Ionic 2实例开发>(点击书名将打开地址:http://yuedu.baidu.com/ebook/ba1bca51e4189 ...