Spring 依赖注入(基本注入和自动适配注入)
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、自动装配
<bean id="customer" class="com.yiibai.common.Customer" autowire="byName" />
- 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 依赖注入(基本注入和自动适配注入)的更多相关文章
- Spring学习笔记之 Spring IOC容器(一)之 实例化容器,创建JavaBean对象,控制Bean实例化,setter方式注入,依赖属性的注入,自动装配功能实现自动属性注入
本节主要内容: 1.实例化Spring容器示例 2.利用Spring容器创建JavaBean对象 3.如何控制Bean实例化 4.利用Spring实现bean属性sett ...
- Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件
1.Spring依赖注入的方式 通过set方法完成依赖注入 通过构造方法完成依赖注入 2.依赖注入的类型 基本数据类型和字符串 使用value属性 如果是指向另一个对象的引入 使用ref属性 User ...
- Spring Ioc源码分析系列--自动注入循环依赖的处理
Spring Ioc源码分析系列--自动注入循环依赖的处理 前言 前面的文章Spring Ioc源码分析系列--Bean实例化过程(二)在讲解到Spring创建bean出现循环依赖的时候并没有深入去分 ...
- spring 依赖注入(IOC DI)
依赖注入(IOC DI) 依赖注入的两种方式: 1. set注入 Spring要求使用set注入方式的时候,Bean需要提供一个无参数的构造方法.并提供一个属性的setter方法.例如: packag ...
- Spring依赖注入(IOC)那些事
小菜使用Spring有几个月了,但是对于它的内部原理,却是一头雾水,这次借着工作中遇到的一个小问题,来总结一下Spring. Spring依赖注入的思想,就是把对象交由Spring容器管理,使用者只需 ...
- Spring依赖注入三种方式详解
在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...
- Spring依赖注入:注解注入总结
更多11 spring 依赖注入 注解 java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...
- Spring 依赖注入,在Main方法中取得Spring控制的实例
Spring依赖注入机制,在Main方法中通过读取配置文件,获取Spring注入的bean实例.这种应用在实训的时候,老师曾经说过这种方法,而且学Spring入门的时候都会先学会使用如何在普通的jav ...
- Spring依赖注入
依赖注入: 使用构造器注入 使用属性setter方法注入 使用Field注入(用于注解方式) 注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员 ...
随机推荐
- CCS的文本及字体
1.文本 CSS 文本属性可定义文本的外观 通过文本属性,您可以改变文本的颜色.字符间距,对齐文本,装饰文本,对文本进行缩进,等等. 缩进文本 把 Web 页面上的段落的第一行缩进,这是一种最常用的文 ...
- java_集合类_简
Collection 来源于Java.util包,实用常用的数据结构,字面意思就是容器 主要方法 boolean add(Object o)添加对象到集合 boolean remove(Object ...
- admin-6
Admin06 基本权限访问方式(权限) 读取:允许查看内容-read r 写入:允许修改内容-write w 可执行:允许运行和切换-execute x 对与文本文件: r:cat head tai ...
- EXCEL日期格式要双击一下单元格才变正确格式
今天遇到标题问题,问度娘后看到一个大神的解答,特此记录整理. 步骤1:在excel中把文本格式日期改为想要的日期格式 步骤2:在旁边空格中输入1,并设置成日期格式,变成1900/1/1: 步骤3:复制 ...
- 在SAS数据步中执行过程步的简单示例
SAS中的许多过程步都是封装好的,而且SAS的编程特点决定了只能是DATA步执行完之后再执行PROC步,或者PROC步执行完之后再执行DATA步.因此有时候DATA步只能利用PROC步执行完之后的结果 ...
- JSON和JSONP,浅析JSONP解决AJAX跨域问题
说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域可以通过服 ...
- 黄聪:如何正确在Vue框架里使用Swiper
实例: 错误(无法显示出分页器按钮,此功能不适用与for循环出来的图片,只有当该页面图片固定几张时能正常用) 第一步: 安装 npm i swiper (vue插件自带) 第二步: 在当前页面里引入 ...
- pll时钟延迟为问题
pll时钟延迟为问题 这关系到pll的工作方式,如果pll内部使用的是鉴频器,则输入和输出将没有固定的相位差,就是每次锁定都锁定在某个相位,但每次都不一样.如果使用的是鉴相器,则输入和输出为0相位差. ...
- submit提交判断
body部分 <form action='https://www.baidu.com' method='post' > 用 户 名:<input ...
- Java程序国际化学习代码一
Java程序国际化初识 1.基本思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每 ...