IOC容器 Bean管理(XML方式)

1、什么是 Bean 管理

  1. Bean 管理指的是两个操作
  2. Spring 创建对象
  3. Spirng 注入属性

2、Bean 管理操作有两种方式

  1. 基于 xml 配置文件方式实现
  2. 基于注解方式实现

本文暂时只讲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方法注入(无参构造注入),使用有参构造方法注入

  1. 使用set方法注入过程

    创建类,定义属性和对应set方法
    在Spring配置文件配置对象创建和属性注入

    <bean id="book" class="com.clearlst.Book">
    		<property name="bname" value="易筋经"></property>
    		<property name="bauthor" value="达摩老祖"></property>
    </bean>
    

    name:类里面属性名称
    value:向属性注入的值

  2. 有参构造方法注入

    创建类,定义属性,创建属性对应有参数构造方法
    配置文件

    <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、字面量

  1. null 值

    <property name="address">
    		 <null/>
    </property>
    
  2. 属性值包含特殊符号

    1.把<>进行转义 & lt; & gt;
    2.使用该格式转义 <![CDATA[<<值>>]]>

    <property name="address">
    	 <value><![CDATA[<<上海>>]]></value>
    </property>
    

2、注入属性-外部 bean

  1. 创建两个类 service 类和 dao 类

  2. 在 service 调用 dao 里面的方法

  3. 在 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、注入属性-级联赋值

  1. 级联赋值 第一种写法:

    <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>
    
  2. 级联赋值 第二种写法:

    <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 注入集合属性

  1. 注入数组类型属性
  2. 注入 List 集合类型属性
  3. 注入 Map 集合类型属性

流程:创建类,定义数组、list、map、set 类型属性,生成对应 set 方法,然后在配置文件中配置

  1. 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方法...
    }
    
  2. 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、把集合注入部分提取出来

  1. 在 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
    
  2. 使用 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 再合适不过了。

流程:

  1. 创建类,让这个类作为工厂 bean,实现接口 FactoryBean
  2. 实现接口里面的方法,在实现的方法中定义返回的 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、直接配置数据库信息

过程:

  1. 配置德鲁伊连接池
  2. 引入德鲁伊连接池依赖 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、引入外部属性文件配置数据库连接池

  1. 创建外部属性文件,properties 格式文件,写数据库信息
  2. 把外部 properties 属性文件引入到 spring 配置文件中(引入 context 名称空间)
  3. 在 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>
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值