闲话

昨晚睡得有点晚,早上八点多起来了,真想睡个午觉,但是又怕下午没时间看书

一、DI依赖注入

1、构造器注入(利用有参构造创建对象)

假设我们想要使用有参构造创建对象,那么我们就需要调整beans.xml配置文件,有以下三种配置可选

  • 通过下标给属性赋值,下标从0开始
public class Bean {// 有参构造方法public Bean (int age, String name) {// ...}
}
<bean id="Bean" class="com.decade.pojo.Bean"><constructor-arg index="0" value="7500000"/><constructor-arg index="1" value="42"/>
</bean>
  • 通过参数的类型进行赋值,基本数据类型可以直接写,但是引用数据类型需要写完整
    这种方法不建议使用,因为会出现2个参数都是同种类型的情况,这样就需要按照构造器中参数的顺序来进行声明
public class Bean {// 有参构造方法public Bean (int age, String name) {// ...}
}
<bean id="Bean" class="com.decade.pojo.Bean"><constructor-arg type="int" value="7500000"/><constructor-arg type="java.lang.String" value="42"/>
</bean>
  • 直接通过参数名来设置或者某个属性需要引用其他类的情况
public class Bean {// 有参构造方法public Bean (ThingTwo thingTow, String name) {// ...}
}
<beans><bean id="beanOne" class="com.decade.pojo.Bean"><constructor-arg ref="beanTwo"/><constructor-arg name="name" value="decade"/></bean><bean id="beanTwo" class="x.y.ThingTwo"/>
</beans>

2、set注入(利用无参构造创建对象)

依赖注入:依赖无参构造,注入属性

  • 依赖:bean对象的创建依赖于容器
  • 注入:bean对象中的所有属性,由容器来注入

1)结合demo做一个简单的了解

首先,我们创建一个实体类Hello,并且声明set方法,因为依赖注入就是使用set方法进行注入的

public class Hello {private String name;public String getName() {return name;}// 依赖注入就是使用set方法进行注入的,去掉此行,bean.xml里面使用property对对象属性进行赋值的操作就会报错public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Hello{"+ "name='" + name + '\''+ '}';}
}

然后我们需要在resource路径下创建与bean相关的配置文件,这里就命名成beans.xml
注意,创建XML文件时,idea右上角会提示该配置文件没有配置到项目中,我们点击配置一下即可

在这里可以查看哪些文件配置已经到项目中

ref:用来引用spring容器中创建好的bean对象
value:设置为具体的值,基本数据类型

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 使用spring来创建对象,在spring中这些对象都称为bean原先创建对象的方式为    类型  变量名 = new 类型()创建一个Hello对象就是  Hello hello = new Hello()这里我们使用bean容器进行对象的创建,所以这里id = 变量名   class = 类型  property = 对象的属性,并且可以通过value对其赋值--><bean id="hello" class="com.decade.pojo.Hello"><property name="name" value="decade"/></bean>
</beans>

然后我们创建对应的测试类去测试一下

import com.decade.pojo.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest {public static void main(String[] args) {// 获取spring的IOC容器ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");// 我们创建的对象都在spring中,我们需要使用这些对象就需要去上下文中获取Hello hello = (Hello) context.getBean("hello");System.out.println("对象的name属性值为=====" + hello.getName());}
}

运行结果如下

2)深入拓展

实际开发中,我们需要创建很多复杂的对象,他的属性不可能仅仅是上面那些简单的基本数据类型
所以,我们还需要做一些拓展,也可以参照 spring官方文档
首先我们创建一个具有各种不同类型属性的实体类

public class Address {private String address;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}import java.util.*;
public class Student {private String name;private Address address;private String[] books;private List<String> hobbies;private Map<String, String> card;private Set<String> games;private String phone;private Properties info;public String getName() {return name;}public void setName(String name) {this.name = name;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public String[] getBooks() {return books;}public void setBooks(String[] books) {this.books = books;}public List<String> getHobbies() {return hobbies;}public void setHobbies(List<String> hobbies) {this.hobbies = hobbies;}public Map<String, String> getCard() {return card;}public void setCard(Map<String, String> card) {this.card = card;}public Set<String> getGames() {return games;}public void setGames(Set<String> games) {this.games = games;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public Properties getInfo() {return info;}public void setInfo(Properties info) {this.info = info;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\''+ ", address=" + address.toString()+ ", books=" + Arrays.toString(books)+ ", hobbies=" + hobbies+ ", card=" + card+ ", games=" + games+ ", phone='" + phone + '\''+ ", info=" + info+ '}';}
}

然后通过beans.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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="address" class="com.decade.pojo.Address"><property name="address" value="南京"/></bean><bean id="student" class="com.decade.pojo.Student"><!--普通属性注入 --><property name="name" value="decade"/><!--Bean注入 --><property name="address" ref="address"/><!--设置某个属性是数组 --><property name="books"><array><value>雪中悍刀行</value><value>龙族</value><value>吞噬星空</value><!-- 如果数组中的元素是对象,那么可以这么设置<ref bean="myDataSourceBean" />--></array></property><!--设置某个属性是list集合 --><property name="hobbies"><list><value>听歌</value><value>看电视</value><value>打游戏</value><!-- 如果list集合中的元素是对象,那么可以这么设置<ref bean="myDataSourceBean" />--></list></property><!--设置某个属性是map集合 --><property name="card"><map><entry key="ID" value="1024"/><entry key="存款账户" value="一百一十爽"/><!-- 如果map的value是对象,那么可以这么设置<entry key="a ref" value-ref="myDataSource"/>--></map></property><!--设置某个属性是set集合 --><property name="games"><set><value>LOL</value><value>王者</value><value>保卫萝卜</value><!-- 如果set集合中的元素是对象,那么可以这么设置<ref bean="myDataSourceBean" />--></set></property><!--设置某个属性是空对象 --><property name="phone"><!-- 如果要设置为空字符串,改为下面这个即可<property name="phone" value=""/>--><null/></property><!--设置某个属性是配置文件 --><property name="info"><props><prop key="ip">127.0.0.1</prop><prop key="port">3306</prop><prop key="userId">root</prop></props></property></bean></beans>

最后,我们写一个测试类进行测试

public class MyTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");Student student = (Student) context.getBean("student");System.out.println(student);}
}

运行结果如下

3、拓展方式注入

1)c命名和p命名空间注入

可参考官方文档为,具体链接如下
p命名空间 c命名空间

p命名空间是针对上面的set注入,而c命名空间是针对构造器注入

我们结合一个代码实例来进行分析
首先我们创建一个User实体类

public class User {private String name;private int age;private Address address;public User() {}public User(String name, int age, Address address) {this.name = name;this.age = age;this.address = address;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' + ", age=" + age + ", address=" + address.getAddress()+ '}';}
}

然后我们使用XML配置文件去管理对象的创建
注意:使用p命名空间和c命名空间需要导入xml约束
xmlns:p=“http://www.springframework.org/schema/p”
xmlns:c=“http://www.springframework.org/schema/c”

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:c="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="address2" class="com.decade.pojo.Address"><property name="address" value="南京"/></bean><bean id="user" class="com.decade.pojo.User" p:age="18" p:name="decade" p:address-ref="address2"/><bean id="user2" class="com.decade.pojo.User" c:age="18" c:name="decade_test" c:address-ref="address2"/>
</beans>

注意,c命名空间还可以使用下标和属性进行关联,如图

最后我们编写一个测试类进行测试

import com.decade.pojo.Student;
import com.decade.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest {@Testpublic void testMethod() {ApplicationContext context = new ClassPathXmlApplicationContext("userBeans.xml");User user = context.getBean("user", User.class);System.out.println("对象user的属性为" + user);System.out.println("========================");User user2 = context.getBean("user2", User.class);System.out.println("对象user2的属性为" + user2);}
}

运行结果如图

如有错误,欢迎指正

【Spring】DI依赖注入(构造器、set、命名空间)相关推荐

  1. Spring DI(依赖注入)构造器注入篇

    Spring 在不使用自动装配的方式进行注入需要我们必须为成员属性提供setter方法,这种方式相对比较繁琐,除了setter方法注入方式外,Spring还为我们提供了构造器配置的注入方式. 构造器默 ...

  2. Spring DI(依赖注入)

    DI依赖注入 IoC(Inversion Of Control)控制翻转,Spring反向控制应用程序所需要使用的外部资源 DI(Dependency Injection)依赖注入,应用程序运行依赖的 ...

  3. Spring DI(依赖注入)Xml篇

    1 DI(依赖注入)简单介绍 如果您对Spring了解甚少,建议先移步我的另一篇博客Spring核心功能IOC之HelloWorld因为下面的内容是在该文章基础上进行阐述的 .我们可以通过一段简单代码 ...

  4. 手写Spring DI依赖注入,嘿,你的益达!

    手写DI 提前实例化单例Bean DI分析 DI的实现 构造参数依赖 一:定义分析 二:定义一个类BeanReference 三:BeanDefinition接口及其实现类 四:DefaultBean ...

  5. Spring DI依赖注入讲解

    DI:dependency injection 依赖注入 在spring框架负责创建Bean对象时,动态将依赖对象注入到Bean组件. public class UserServiceImpl imp ...

  6. Spring DI(依赖注入)注解篇

    1 课程内容介绍 我之前写的的一篇博客Spring核心功能DI(依赖注入)xml篇主要介绍了如何通过配置xml的方式来实现依赖注入,今天我们来介绍如何通过注解方式完成我们的依赖注入操作. 2 注入基本 ...

  7. Spring DI[依赖注入]

    依赖注入(Dependency Injection,简称DI)意思是由容器或者框架将被调用类注入给调用对象,以此来降低调用对象和被调用类之间的依赖关系. 依赖注入主要有2种不同的实现形式: 1. 构造 ...

  8. Spring DI依赖注入方式

    1.构造器注入 2.Set方式注入[重点] 依赖注入:Set注入 依赖:bean对象的创建依赖于容器 注入:bean对象中的所有属性,由容器来注入. [环境搭建] Student package co ...

  9. spring:setter注入构造器注入注解注入

    一.内容回顾 简述对spring框架的了解 优点 高内聚低耦合 可拔插式设计模式 XML配置 便于维护 Sping 可以和各大优秀的框架很好结合(Struts2 springmvc mybatis h ...

最新文章

  1. 微软收购 GitHub 两年后,大咖共论开源新生态
  2. timer 公司内部用法
  3. python画三维温度散点图-python 绘制三维图形、三维数据散点图
  4. ML之回归预测:利用九大类机器学习算法对无人驾驶汽车系统参数(2018年的data,18+2)进行回归预测值VS真实值
  5. [codevs 1343] 蚱蜢(省队选拔赛湖南)
  6. 字符之间或者结构体之间比较
  7. 数人云牵手红帽Ansible:七大最佳实践解锁DevOps落地姿势
  8. 百度08年网页搜索份额73.2% 创历史新高
  9. 极速办公(word)字体如何设置为斜体
  10. VMware Cloud Director 10.3 发布(下载) - 云计算调配和管理平台
  11. Java当中native方法的详解
  12. tbschedule源码学习
  13. Unity导入免费的素材资源
  14. 小程序中点击二维码图片预览、长按转发、保存、识别图中二维码
  15. python实现运动模糊图像_OpenCV+Python实现图像运动模糊和高斯模糊!它是编程界的PS!...
  16. echartsdemo可视化统计(笔记分享)
  17. java aws_适用于Java的AWS开发工具包-开发人员-AWS文档.PDF
  18. FineReport的数据库
  19. 银河麒麟连不上网怎么办
  20. Arduino超声波传感器使用

热门文章

  1. ##、#、#@在C中的作用(VC)
  2. jQuery遍历table中的tr td并获取td中的值
  3. android stuido去掉右侧中白线
  4. 软件测试秋招技术面试(面经)
  5. 2021黄山高考成绩查询,2021黄山市地区高考成绩排名查询,黄山市高考各高中成绩喜报榜单...
  6. 【面试整理】 应届JAVA(初级)的一次面试经过
  7. 黄光裕:锻造国美“屠刀”《前程密码》
  8. 快捷指令获取url内容_iphone12相机水印快捷指令怎么添加-iphone12相机水印快捷指令添加教程...
  9. sso统一认证postMessage无感处理
  10. QT 远程升级 实现设备升级