Spring创建对象的时机
String config = "beans.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
读到这一行的时候,Spring跳转到配置文件去获取类信息
<bean id= "someService" class = "类路径"/>
//id一般是开头小写的类名,对应类名开头大写
//<bean id ="someService" class = "上面的类路径">
//这样的语法可以从同一个类中简单地创建多个对象
读取这个<Bean>的时候,对象就被生成了,之后就可以用getBean来获取生成的对象了。
spring默认创建对象的时机:在创建Spring的容器时,会创建配置文件中所有的对象。
获取容器中Spring对象的信息
package course01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class prepareForTest {
public static void test01() {
String config = "beans.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
//使用Spring提供的方法,来获取容器中定义的对象数量
int nums = ac.getBeanDefinitionCount();
System.out.println("容器中定义对象的数量"+nums);
//容器中每个定义的对象名称
String names[] = ac.getBeanDefinitionNames();
for (String str: names
) {
System.out.println(str);
}
}
}
上面展示了获取对象数量和对象名称(字符串数组类型)的api
Spring创建非自定义类的对象?
可以在bean里面配置非自定义类的对象,同样是识别id加上全类名
di实现
DI的实现有两种:
1在Spring的配置文件中,使用标签和属性完成,叫做基于xml的di实现
2使用Spring的注解完成属性赋值,叫做基于注解的di实现
DI:依赖注入
bean实例在调用无参构造器创建对象后,就要对bean对象的属性进行初始化。初始化是由容器自动完成的,称为注入。
IoC操作Bean管理
1)Spring对象创建
2)Spring注入属性
语法分类
根据注入方式的不同,常用的有两类:Set注入,构造注入
set注入(需掌握):
set注入也叫作设值注入,是指,通过setter方法传入被调用者的实例,这种注入方式简单,至关,因而在Spring的依赖注入中大量使用。
构造注入: Spring调用类的有参构造方法,构造对象。在方法中完成赋值
创建Junit测试类的方法
先导入Junit包,一般习惯在src同级目录下加test目录,在需要的方法前加@Test
用无参构造创建基础对象,如果创建了构造函数,需要重新声明无参构造,不然就无法使用
set注入
通过setter方法进行属性注入
<bean id="book" class="com.study.lele.Bean.BookSetTesting">
<!--
做法:在bean标签里面使用Property标签完成属性注入
name:类里面的属性名称
value:注入的属性值
-->
<property name="bauthor" value="小蕾是天使"></property>
<property name="bname" value="平平"></property>
</bean>
测试
@Test
public void test01(){
String config = "bean.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(config);
BookSetTesting book = (BookSetTesting) context.getBean("book");
System.out.println(book);
}
简化:p名称空间注入
1在beans里加上属性: xmlns:p(xml约束,命名空间)
="..../(前面的beans改成p{为了区分})"
2 <bean id="book" class="com.study.lele.Bean.BookSetTesting"
p:bname="值1" p:bauthor="值2">
相当于简化后的Property(一般没谁这么做)
</bean>
构造注入
通过有参构造函数进行属性注入
<bean id = "order1" class="com.study.lele.Bean.TOrder">
<!-- 使用constructor-arg标签-->
<constructor-arg name="oname" value="abc"></constructor-arg>
<constructor-arg name="address" value="GDOU"></constructor-arg>
</bean>
注入的是构造函数的每个参数。
向属性里面设置特殊值
一般
- null值
<property><null></property>
- 属性值包含特殊符号
假如是<>
1 转义符号 <>
2 不想转义
把带特殊符号内容写进CDATA【xml里面的自带空间】
<value><![CDATA[<<尖括号>]]></value>
包含在CDATA里面的部分被告知原样输出。
注入外部bean
三层架构先来两层——>service 调用dao
- 1 创建两个类service和dao类
- 2 在service里面调用dao的方法
- 3 在Spring配置文件中进行配置。
- 4 将dao注入到service
(上面说明注入的类型不仅仅是内置类型)
<bean id="userService" class="com.study.lele.serviceTest1.UserService01">
<!--
注入userDao对象
name属性值:类里面的属性名称
ref属性:创建userDao对象bean标签里面的id值,通过id值找到这个对象并且注入进来
-->
<property name="userDao" ref="userDaoImpl"></property>
</bean>
<!--2userDao是一个街口,要创建对象实际上是创建接口的实现类-->
<bean id="userDaoImpl" class="com.study.lele.daoTest1.impl.UserDaoImpl">
</bean>
注入内部bean和级联赋值
(1)一对多关系:部门和员工
一个部门里面可以有多个员工,一个员工属于某一个部门
(2)在实体类之间表示一对多关系,将所属部门作为员工实例的一个属性。
(3)在Spring文件中进行配置
<bean id="emp" class="com.study.lele.Bean.beanTest2.Emp">
<!-- 设置两个普通属性 -->
<property name="eName" value="lele"></property>
<property name="eEnder" value="男"></property>
<!-- 设置对象类型属性 -->
<property name="dept" >
<bean id ="dept" class="com.study.lele.Bean.beanTest2.Dept">
<property name="dname" value="实践部"></property>
</bean>
</property>
</bean>
使用如上方法,可以在bean的内部声明一个要创建的bean作为属性,不用声明以后再引入。
级联赋值
写法
1 <bean id="emp" class="com.study.lele.Bean.beanTest2.Emp">
<!-- 设置两个普通属性 -->
<property name="eName" value="lele"></property>
<property name="eEnder" value="男"></property>
<!-- 设置对象类型属性 -->
<property name="dept" ref="dept">
</property>
<property name="dept.dname" value="技术部">
</property>
这里要求dept对象有getter()
可以在引入dept对象的同时对该对象的属性进行赋值。
</bean>
<bean id ="dept"
class="com.study.lele.Bean.beanTest2.Dept">
<property name ="dname" value ="财务部"></property>
xml注入集合属性
- 注入数组类型属性
- 注入List集合类型属性
- 注入Map集合类型属性
package com.study.lele;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Stu {
//1 数组类型的属性
private String [] course;
//2 list集合类型的属性
private List<String> list;
//3 Map集合类型的属性
private Map<String,String> maps;
//4 set集合类型的属性
private Set<String> sets;
public void setSet(Set<String> sets) {
this.sets = sets;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
public void setCourse(String[] course) {
this.course = course;
}
}
1 创建类,定义数组,list,map,set类型属性,设置对应setter()
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--1集合类型属性注入-->
<bean id="stu" class="com.study.lele.Stu">
<!--数组类型属性注入 -->
<property name="course" >
<array>
<value>java</value>
<value>C++</value>
<value>C</value>
<value>Python</value>
</array>
</property>
<!--list类型属性注入 -->
<property name="list">
<list>
<value>li1</value>
<value>li2</value>
<value>li3</value>
<value>li4</value>
</list>
</property>
<!--map类型属性注入 -->
<property name="maps">
<map>
<entry key="java" value="1"></entry>
<entry key="C++" value="2"></entry>
<entry key="Python" value="0"></entry>
</map>
</property>
<!-- set类型属性注入 -->
<property name="set">
<set>
<value>MySQL</value>
<value>Redis</value>
<value>SQLServer</value>
</set>
</property>
</bean>
</beans>
如图,Spring配置文件提供了多种集合标签用于给集合属性进行赋值。
那要是在集合里设置对象类型值呢?
package com.study.lele;
public class Course {
private String cname;
public void setCname(String cname) {
this.cname = cname;
}
@Override
public String toString() {
return "Course{" +
"cname='" + cname + '\'' +
'}';
}
}
使用如下方法给一个course的List赋值
<property name="courseList">
<list>
<ref bean = "course1"></ref>
<ref bean = "course2"></ref>
</list>
</property>
</bean>
<bean id="course1" class="com.study.lele.Course"><property name="cname" value="Spring5"></property></bean>
<bean id="course2" class="com.study.lele.Course"><property name="cname" value="MyBatis"></property></bean>
- 将集合注入部分提取出来
1 在Spring配置文件中引入名称空间util
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
2 在里面使用util标签完成list集合注入抽取
<!--提取list集合类型属性注入 -->
<util:list id="bookList">
<value>值1</value>
<value>值2</value>
<value>值3</value>
</util:list>
<!--使用 -->
<bean id="book" class="com.study.lele.Book">
<property name="list" ref="bookList"></property>
</bean>
相当于定义了一个公用命名空间里的常量,所有的bean都可以用它来赋值自己的集合呢。
本文深入探讨Spring框架的创建对象时机、如何获取容器对象信息以及DI(依赖注入)的实现,包括基于XML和注解的方式。讲解了IoC(控制反转)在Bean管理中的应用,详细阐述了Set注入和构造注入的原理与实践。同时,介绍了如何在Junit测试中创建和管理Spring对象,以及如何处理特殊属性值、注入外部和内部Bean的情况,最后讨论了XML配置中集合属性的注入方法。
1092

被折叠的 条评论
为什么被折叠?



