1、什么是 Bean 管理
- Bean 管理指的是两个操作
- Spring 创建对象
- Spirng 注入属性
2、Bean 管理操作有两种方式
- 基于 xml 配置文件方式实现
- 基于注解方式实现
本文暂时只讲XML方式,注解方式看当前博客的注解方式文章。
1、基于 xml 方式创建对象
<bean id="book" class="com.clearlast.manual_insertion.testDemo.Book">
id属性:类的别名,唯一标识(这个id值是唯一的,不可重复)
class属性:类的全路径名(包类路径)
创建对象时候,默认是执行无参数构造方法完成对象创建的。
2、基于 xml 方式注入属性
- DI(Dependency injection):依赖注入,就是在类中给属性注入属性值
DI 是IOC容器的具体实现,DI 需要在创建对象的基础之上来完成。
3.使用set方法注入(无参构造注入),使用有参构造方法注入
-
使用set方法注入过程
创建类,定义属性和对应set方法
在Spring配置文件配置对象创建和属性注入<bean id="book" class="com.clearlst.Book"> <property name="bname" value="易筋经"></property> <property name="bauthor" value="达摩老祖"></property> </bean>
name:类里面属性名称
value:向属性注入的值 -
有参构造方法注入
创建类,定义属性,创建属性对应有参数构造方法
配置文件<bean id="orders" class="com.clearlast.Orders"> <constructor-arg name="oname" value="手机"></constructor-arg> <constructor-arg name="address" value="中国"></constructor-arg> </bean>
constructor-arg属性:构造函数参数。
4、使用p标签简化注入属性操作
第一步,加p标签
第二步,使用p标签
<bean id="pdi" class="com.clearlast.manual_insertion.testDemo.PDI" p:id="2" p:name="李四" ></bean>
通过 p:类的属性名 = “属性值” 的格式来给类属性注入属性值。
5、IOC 操作 Bean 管理(注入其他类型属性)
1、字面量
-
null 值
<property name="address"> <null/> </property>
-
属性值包含特殊符号
1.把<>进行转义 & lt; & gt;
2.使用该格式转义 <![CDATA[<<值>>]]><property name="address"> <value><![CDATA[<<上海>>]]></value> </property>
2、注入属性-外部 bean
-
创建两个类 service 类和 dao 类
-
在 service 调用 dao 里面的方法
-
在 spring 配置文件中进行配置
public class UserService { //创建 UserDao 类型属性,生成 set 方法 private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void add() { System.out.println("service....."); userDao.update(); } }
service 和 dao 对象创建
<bean id="userService" class="com.clearlast.service.UserService"> <property name="userDao" ref="userDaoImpl"></property> </bean> <bean id="userDaoImpl" class="com.clearlst.dao.UserDaoImpl"></bean>
name 属性:类里面属性名称
ref 属性:创建 userDao 对象 bean 标签 id 值
3、注入属性-内部 bean
<!--内部 bean-->
<bean id="emp" class="com.clearlast.bean.Emp">
<!--设置两个普通属性-->
<property name="ename" value="tom"></property>
<property name="gender" value="男"></property>
<!--设置对象类型属性-->
<property name="dept">
<bean id="dept" class="com.clearlast.bean.Dept">
<property name="dname" value="安保部"></property>
</bean>
</property>
</bean>
总结:相当于在类中注入内部bean,在内部bean中在注入属性。
4、注入属性-级联赋值
-
级联赋值 第一种写法:
<bean id="emp" class="com.clearlast.bean.Emp"> <!--设置两个普通属性--> <property name="ename" value="jack"></property> <property name="gender" value="男"></property> <!--级联赋值--> <property name="dept" ref="dept"></property> </bean> <bean id="dept" class="com.clearlast.bean.Dept"> <property name="dname" value="财务部"></property> </bean>
-
级联赋值 第二种写法:
<bean id="emp" class="com.clearlast.bean.Emp"> <!--设置两个普通属性--> <property name="ename" value="tom"></property> <property name="gender" value="男"></property> <!--级联赋值--> <property name="dept" ref="dept"></property> <property name="dept.dname" value="技术部"></property> </bean> <bean id="dept" class="com.clearlast.bean.Dept"> <property name="dname" value="财务部"></property> </bean>
6、IOC 操作 Bean 管理(xml 注入集合属性)
1、xml 注入集合属性
- 注入数组类型属性
- 注入 List 集合类型属性
- 注入 Map 集合类型属性
流程:创建类,定义数组、list、map、set 类型属性,生成对应 set 方法,然后在配置文件中配置
-
类
public class Stu { //1 数组类型属性 private String[] courses; //2 list 集合类型属性 private List<String> list; //3 map 集合类型属性 private Map<String,String> maps; //4 set 集合类型属性 private Set<String> sets; set方法... }
-
Spring配置
1、注入数组类型属性
2、注入 List 集合类型属性
3、注入 Map 集合类型属性<!--1 集合类型属性注入--> <bean id="stu" class="com.clearlast.collectiontype.Stu"> <!--数组类型属性注入--> <property name="courses"> <array> <value>Hiphop</value> <value>Popping</value> </array> </property> <!--list 类型属性注入--> <property name="list"> <list> <value>House</value> <value>Krump</value> </list> </property> <!--map 类型属性注入--> <property name="maps"> <map> <entry key="JAVA" value="java"></entry> <entry key="PHP" value="php"></entry> </map> </property> <!--set 类型属性注入--> <property name="sets"> <set> <value>MySQL</value> <value>Redis</value> </set> </property> </bean>
4、在集合里面设置对象类型值
在Stu类中定义list集合属性,通过property属性来给list集合添加对象(通过list,ref)
<bean id="stu" class="com.clearlast.collectiontype.Stu"> <bean id="course1" class="com.clearlast.collectiontype.Course"> <property name="cname" value="Java"></property> </bean> <bean id="course2" class="com.clearlast.collectiontype.Course"> <property name="cname" value="Python"></property> </bean> <!--注入 list 集合类型,值是对象--> <property name="courseList"> <list> <ref bean="course1"></ref> <ref bean="course2"></ref> </list> </property> </bean>
2、把集合注入部分提取出来
- 在 spring 配置文件中引入名称空间 util
xmlns:util="http://www.springframework.org/schema/util" http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
- 使用 util 标签完成 list 集合注入提取
util下还有util:set , util:map 等<util:list id="bookList"> //这里的id随意定义 <value>易筋经</value> <value>九阴真经</value> <value>九阳神功</value> </util:list> <!--2 提取 list 集合类型属性注入使用--> <bean id="book" class="com.clearlast.collectiontype.Book"> <property name="list" ref="bookList"></property> </bean>
7、IOC操作Bean管理(FactoryBean)
Spring 有两种类型 bean,一种普通 bean,另外一种工厂 bean(FactoryBean)
- 普通 bean:在配置文件中定义 bean 类型就是返回类型
- 工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样
1、FactoryBean使用场景
FactoryBean 用来创建一类bean。比如你有一些同属鸟类的bean需要被创建,但是它们自己有各自的特点,你只需要把他们的特点注入FactoryBean中就可以生产出各种鸟类的实例。举一个更加贴近实际生产的例子。甚至这个例子你可以应用到实际java开发中去。我们需要自己造一个定时任务的轮子。用FactoryBean 再合适不过了。
流程:
- 创建类,让这个类作为工厂 bean,实现接口 FactoryBean
- 实现接口里面的方法,在实现的方法中定义返回的 bean 类型
public class MyBean implements FactoryBean<Course> {
//定义返回 bean
@Override
public Course getObject() throws Exception { //返回对象的实例
Course course = new Course();
course.setCname("abc");
return course;
}
@Override
public Class<?> getObjectType() { //返回对象的类型
return null;
}
@Override
public boolean isSingleton() { //是否是单例
return false;
}
}
- T getObject()
获取泛型T的实例。用来创建Bean。当IoC容器通过getBean方法来FactoryBean创建的实例时实际获取的不是FactoryBean本身,而是具体创建的T泛型实例。等下我们会来验证这个事情。 - Class<?> getObjectType() 获取 T getObject()中的返回值 T的具体类型。
这里强烈建议如果T是一个接口,返回其具体实现类的类型。 - default boolean isSingleton()
用来规定Factory创建的的bean是否是单例。默认不是单例。
<bean id="myBean" class="com.clearlast.factorybean.MyBean"></bean>
获取的虽然是myBean,但是给的是Course的Class
@Test
public void test3() {
ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
Course course = context.getBean("myBean", Course.class);
System.out.println(course);
}
8、 IOC 操作 Bean 管理(外部属性文件)
1、直接配置数据库信息
过程:
- 配置德鲁伊连接池
- 引入德鲁伊连接池依赖 jar 包
<!--直接配置连接池--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/userDb"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean>
2、引入外部属性文件配置数据库连接池
- 创建外部属性文件,properties 格式文件,写数据库信息
- 把外部 properties 属性文件引入到 spring 配置文件中(引入 context 名称空间)
- 在 spring 配置文件使用标签引入外部属性文件
<!--引入外部属性文件--> <context:property-placeholder location="classpath:jdbc.properties"/> <!--配置连接池--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${prop.driverClass}"></property> <property name="url" value="${prop.url}"></property> <property name="username" value="${prop.userName}"></property> <property name="password" value="${prop.password}"></property> </bean>