Spring 依赖注入

Spring框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系。

1、属性注入

IService:

 public interface IUserService {
/*
* 说话
*/
void Say(String msg);
}

ServiceImp:

 public class UserServiceImpl implements IUserService {

     private IUserDao iUserDao;

     public void setUserDao(IUserDao dao) {
this.iUserDao=dao;
} /*
* 说话
*/
public void Say(String msg) {
this.iUserDao.Say(msg);
}
}

IDao:

 public interface IUserDao {
/*
* 说话
*/
void Say(String msg);
}

DaoImp:

 public class UserDaoImpl implements IUserDao {
/*
* 说话
*/
public void Say(String msg) {
System.out.println(msg);
}
}

Bean:

 <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userServerId" class="serviceImpl.UserServiceImpl">
<!-- 此处是set属性注入,name值必须和UserServiceImpl中属性名一致 -->
<property name="userDao" ref="userDaoId"></property>
</bean>
</beans>

测试输出:

 public class MainShow {
public static void main(String[] args) {
System.out.println("开始执行。。。"); ApplicationContext context=new ClassPathXmlApplicationContext("resources/beans.xml");
IUserService idog=(IUserService)context.getBean("userServerId");
idog.Say("汪汪汪。。。");
}
}

2、构造注入

IService:

 public interface IDogService {
/*
* 叫
*/
void Call(String msg);
}

ServiceImp:

 public class DogServiceImpl implements IDogService {

     private IDogDao idogdao;

     public DogServiceImpl(DogDaoImpl dogDao) {
System.out.println("开始构造注入.....");
this.idogdao=dogDao;
} /*
* 叫声
*/
public void Call(String msg) {
idogdao.Call(msg);
}
}

IDao:

 public interface IDogDao {
/*
* 叫
*/
void Call(String msg);
}

DaoImp:

 public class DogDaoImpl implements IDogDao {

     public void Call(String msg) {
System.out.println("汪汪汪:"+msg);
}
}

Bean:

 <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 构造注入 -->
<bean id="dogId" class="serviceImpl.DogServiceImpl">
<constructor-arg ref="dogDao"/>
</bean> <bean id="dogDao" class="daoImpl.DogDaoImpl"></bean>
</beans>

3、内部注入

IService:

 public interface ICarService {
/*
* 汽车启动
*/
void Start();
}

ServiceImp:

     private ICarDao idao;

     public void setIdao(CarDaoImpl impl) {
this.idao = impl;
} public void Start() {
idao.Start();
}
}

IDao:

 public interface ICarDao {
/*
* 汽车启动
*/
void Start();
}

DaoImp:

 public class CarDaoImpl implements ICarDao {    

     public void Start() {
System.out.println("汽车开始启动。。。。。。");
}
}

Bean:

 <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 内部注入 -->
<bean id="carId" class="serviceImpl.CarServiceImpl">
<property name="idao">
<bean class="daoImpl.CarDaoImpl"></bean>
</property>
</bean>
</beans>

4、自动装配

在Spring框架,可以用 auto-wiring 功能会自动装配Bean。要启用它,只需要在 <bean> 定义“autowire”属性。
<beans/> 标签可以定义 default-autowire-candidate="false" 属性让它和它包含的所有 bean 都不做为候选bean。
 <bean id="customer" class="com.yiibai.common.Customer" autowire="byName" />
在Spring中,支持 5 自动装配模式。
  • no – 缺省情况下,自动配置是通过“ref”属性手动设定
  • byName – 根据属性名称自动装配。如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它。
  • byType – 按数据类型自动装配。如果一个bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它。
  • constructor – 在构造函数参数的byType方式。
  • autodetect – 如果找到默认的构造函数,使用“自动装配用构造”; 否则,使用“按类型自动装配”。

ServiceImp:

 public class UserServiceImpl implements IUserService {

     private IUserDao userDao;

     public void setUserDao(UserDaoImpl dao) {
this.userDao=dao;
} /*
* 说话
*/
public void Say(String msg) {
this.userDao.Say(msg);
}
}

IDao:

 public interface IUserDao {
/*
* 说话
*/
void Say(String msg);
}

DaoImp:

 public class UserDaoImpl implements IUserDao {
/*
* 说话
*/
public void Say(String msg) {
System.out.println(msg);
}
}

通常情况下,进行明确的装配目标 Bean

 <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userServerId" class="serviceImpl.UserServiceImpl">
<!-- 此处是set属性注入,name值必须和UserServiceImpl中属性名一致 -->
<property name="userDao" ref="userDaoId"></property>
</bean> <bean id="userDaoId" class="daoImpl.UserDaoImpl"></bean>
</beans>

1、由类型 (Type) 自动装配:

 <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Type自动装配注入 -->
<bean id="userServerId" class="serviceImpl.UserServiceImpl" autowire="byType"/>
<bean id="userDaoId" class="daoImpl.UserDaoImpl"></bean>
</beans>

2、由类型 (Name) 自动装配:

 <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Name 自动装配注入 -->
<bean id="userServerId" class="serviceImpl.UserServiceImpl" autowire="byName"/>
<bean id="userDao" class="daoImpl.UserDaoImpl"></bean>
</beans>

3、构造函数自动装配:

ServiceImp:

 public class DogServiceImpl implements IDogService {

     private IDogDao idogdao;

     public DogServiceImpl(DogDaoImpl dogDao) {
System.out.println("开始构造注入.....");
this.idogdao=dogDao;
} /*
* 叫声
*/
public void Call(String msg) {
idogdao.Call(msg);
}
}

IDao:

 public interface IDogDao {
/*
* 叫
*/
void Call(String msg);
}

DaoImp: 

 public class DogDaoImpl implements IDogDao {

     public void Call(String msg) {
System.out.println("狗叫:"+msg);
}
}

通常情况下,使用构造注入Bean,配置如下:

 <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 构造注入 -->
<bean id="dogId" class="serviceImpl.DogServiceImpl">
<constructor-arg ref="dogDao"/>
</bean>
<bean id="dogDao" class="daoImpl.DogDaoImpl"></bean>
</beans>

自动装配用构造函数启用后,你可以不设置构造器属性。Spring会找到兼容的数据类型,并自动装配它。

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Constructor 构造自动装配 -->
<bean id="dogId" class="serviceImpl.DogServiceImpl" autowire="constructor"/>
<!-- 有无Id都可以 -->
<bean id="dogDaos" class="daoImpl.DogDaoImpl"></bean>
</beans>

Spring 依赖注入(基本注入和自动适配注入)的更多相关文章

  1. Spring学习笔记之 Spring IOC容器(一)之 实例化容器,创建JavaBean对象,控制Bean实例化,setter方式注入,依赖属性的注入,自动装配功能实现自动属性注入

    本节主要内容:       1.实例化Spring容器示例    2.利用Spring容器创建JavaBean对象    3.如何控制Bean实例化    4.利用Spring实现bean属性sett ...

  2. Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件

    1.Spring依赖注入的方式 通过set方法完成依赖注入 通过构造方法完成依赖注入 2.依赖注入的类型 基本数据类型和字符串 使用value属性 如果是指向另一个对象的引入 使用ref属性 User ...

  3. Spring Ioc源码分析系列--自动注入循环依赖的处理

    Spring Ioc源码分析系列--自动注入循环依赖的处理 前言 前面的文章Spring Ioc源码分析系列--Bean实例化过程(二)在讲解到Spring创建bean出现循环依赖的时候并没有深入去分 ...

  4. spring 依赖注入(IOC DI)

    依赖注入(IOC DI) 依赖注入的两种方式: 1. set注入 Spring要求使用set注入方式的时候,Bean需要提供一个无参数的构造方法.并提供一个属性的setter方法.例如: packag ...

  5. Spring依赖注入(IOC)那些事

    小菜使用Spring有几个月了,但是对于它的内部原理,却是一头雾水,这次借着工作中遇到的一个小问题,来总结一下Spring. Spring依赖注入的思想,就是把对象交由Spring容器管理,使用者只需 ...

  6. Spring依赖注入三种方式详解

    在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...

  7. Spring依赖注入:注解注入总结

    更多11   spring   依赖注入   注解   java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...

  8. Spring 依赖注入,在Main方法中取得Spring控制的实例

    Spring依赖注入机制,在Main方法中通过读取配置文件,获取Spring注入的bean实例.这种应用在实训的时候,老师曾经说过这种方法,而且学Spring入门的时候都会先学会使用如何在普通的jav ...

  9. Spring依赖注入

    依赖注入: 使用构造器注入 使用属性setter方法注入 使用Field注入(用于注解方式) 注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员 ...

随机推荐

  1. 在VMware上安装CentOS6 64位操作系统

    ---恢复内容开始--- 1.创建新的虚拟机 2.选择自定义,点击下一步: 3.找到镜像位置,添加: 4.点击“稍后安装操作系统”,点击“下一步”: 5.默认点击“下一步”,然后分配CPU: 这里内存 ...

  2. Arch Linux 硬盘引导-联网安装

    Arch Linux 硬盘引导-联网安装 ============https://www.archlinux.org/https://wiki.archlinux.org/https://wiki.a ...

  3. HOMEWORD2

    开发工具和语言选择 语言 :pyhton3.6 工具 我选择的是 pycharm2019.1.由于之前已经安装好了,这里就不再贴出. 自动单元测试练习 python单元测试框架Unittest.Uni ...

  4. 经典问题----拓扑排序(HDU2647)

    题目简介:有个工厂的老板给工人发奖金,每人基础都是888,工人们有自己的想法,如:a 工人想要比 b 工人的奖金高,老板想要使花的钱最少 那么就可以 给b 888,给a 889 ,但是如果在此基础上, ...

  5. 查看python的OpenCV版本

    安装"opencv" pip install opencv-python查看版本 import cv2 cv2.__version__

  6. RGB颜色名称与色值对应表

    实色效果 英文名称 R.G.B 16色 实色效果 英文名称 R.G.B 16色   Snow 255 250 250 #FFFAFA   PaleTurquoise1 187 255 255 #BBF ...

  7. 福利之——如何写好年终总结PPT

    撰写年终总结PPT大致分三个步骤(TDR三部曲): 第一步:确定大纲(THINK) 第二步:优化PPT(DESIGN) 第三步:练习演讲(REHEARSE) 让领导看见你的成绩,听明白你未来的‘宏伟计 ...

  8. Magento 1.9.x 子分类无法访问

    app/code/core/Mage/Catalog/Model/Url.php 大概 ~807: Change: if ($product->getUrlKey() == '' &&a ...

  9. 我提出了一个 Lean Html 5 的 概念 和 标准

    提出 Lean Html 5 是因为 Html 可以作为 一个 应用程序 开发 的 标准 和 平台, 应用程序 包括 Web 程序 , 本地程序 , 桌面程序 , 嵌入式程序 , 串口通信 等 . L ...

  10. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets(388,5): warning MSB8028: The intermediate directory (Debug) contains files shared from another project (GU.vcxproj). T

    1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets(388,5): warni ...