【javaWeb补充篇&配置Bean】XML配置Bean

配置Bean

以配置文件的形式配置Bean
在资源目录下创建.xml文件进行对Bean的配置
在创建文件之前还首先需要引入spring中spring-context的依赖

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
		</dependency>

在XML文件之中配置bean

<?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">

   <bean id="deptServiceimpl" class="com.example.service.impl.DeptServiceimpl"></bean>
</beans>

然后在类中获取bean:

   public static void main(String[] args) {
       //获取IOC容器
       ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
       //获取Bean
       DeptService deptServiceimpl = (DeptService) ctx.getBean("deptServiceimpl");
   }
  • bean别名配置

别名
通过name属性设置多个别名

  • bean作用范围的配置

作用范围

  • 通过静态工厂进行bean的实例化:

手写一个实例化工厂

public class OrderDaoFactory{
public static OrderDao getOrderDao(){
  return new OrderDaoImpl();
}
}

再在该xml文件中引入该静态实例化bean的方法

<bean
    id="orderDao"
    factory-method="getOrderDao"
    class="class.itheima.factory.OrderDaoFactory"
  • 使用FactoryBean实例化bean
public class UserDaoFactoryBean implements FactoryBean<UserDao>{
//代替原始实例工厂创建对象的方法
public UserDao getObject() throws Exception{
  return new UserDaoImpl();
}
public Class<?> getObjectType(){
  return UserDao.class;
}
}

在配置文件当中xml

<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>

Bean的声明周期

  • 初始化容器:
  1. 创建对象(内存分配)
  2. 执行构造方法
  3. 执行属性注入(set操作)
  4. 执行bean初始化方法
  • 使用bean

执行业务操作

  • 关闭/销毁容器
  1. 执行bean的销毁方法

bean的销毁时机

容器关闭前触发bean的销毁
关闭容器方式:
ConfigurableApplicationContext接口close()操作
注册关闭钩子,在虚拟机退出前关闭容器再退出虚拟机
configurableApplicationContext接口registerShutdownHook()操作

依赖注入方式

  • setter注入

简单类型,引用类型

在实体类中如何通过setter来配置属性:

public class BookDaoImpl implements BookDao{
private int connetionNum;
public void setconnetionNum(int connetionNum){
this.connetionNum=connetionNum;
}
}

在这个实体类中给出了属性对应的set方法,在对应的bean的xml中给出响应的配置即可

<bean id="bookDao" class="....">
<property name="connectionNum" value="100"/>
</bean>

这样就对简单类型做出了响应的依赖注入

  • 构造器注入

简单类型,引用类型

对简单类型在实体类通过构造器进行注入:

public class BookDaoImpl implements BookDao{
private int connetionNum;
public void setconnetionNum(int connetionNum){
this.connetionNum=connetionNum;
}
}

在对应的xml文件中进行配置

<bean id="bookDao" class="....">
<constructor-arg name="bookDao" ref="bookDao"/>
</bean>


//可以
<bean id="bookDao" class="....">
<constructor-arg name="databaseName" value="mysql"/>
</bean>

注意第一个name中是构造器中的形参
但是这样进行配置会导致配置文件与代码的耦合度非常的高
我们可以略加修改:

<bean id="bookDao" class="....">
<constructor-arg type="java.long.String" value="mysql"/>
</bean>

这样就解决了文件之间的耦合问题,但是如果存在多个类型相同的参数,应该怎么办呢,我们略作修改

<bean id="bookDao" class="....">
<constructor-arg index="0" value="mysql"/>
<constructor-arg index="1" value="dad"/>
</bean>

通过参数所在的位置来进行注解能很好的改变这一问题

自动装配

通过XML文件实现对类的自动装配

<bean id="bookDao" class="...."/>
<bean id="bookService" class="..." autowire="byType"/>

通过bean中的autowire属性进行类型注入

  • 依赖自动装配特征
  1. 自动装配用于引用型类型依赖注入,不能对简单类型进行操作
  2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
  3. 使用按名称装配时(byname)必须保障容器中具有相同指定名称的bean,因变量名与配置耦合,不推荐使用
  4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

集合注入

在实体类中创建集合类型的依赖注入

public class BookDaoImpl implements BookDao{
private int[] array;
private List<String> list;
public void setArray(int[] array){
this.array=array;
}
 }

在xml文件中给出相应的配置:

<bean id="bookDao" class="...">
  <property name="array">
       <array>
              <value>100</value>
              <value>100</value>
       </array>
     </property>  
</bean>

list集合的配置形式与其相同,Map的配置形式

<bean id="bookDao" class="...">
  <property name="map">
           <map>
                    <entry key="" value=""/>
           </map>
     </property>  
</bean>

对于properties的xml配置类型如下:

<bean id="bookDao" class="...">
  <property name="properties">
         <props>
             <prop key="">ssss</prop>
         </props>
     </property>  
</bean>

加载properties文件

在spring中加载外部的properties文件:

需要在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"
      xmlns:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
                          http://www.springframework.org/schema/beans/spring-beans.xsd
                          http://www.springframework.org/schema/context
                          http://www.springframework.org/schema/context/spring-context.xsd"

       ">

如何加载properties文件

<context:property-placeholder location="properties文件"/>

如何使用文件中的属性名:

<bean class=".....">
    <property name="..." value="${文件中的属性名}"> 
</bean>

如何加载多份properties文件:

<context : property-placeholder location="classpath:*.properties" system-properties-mode="NEVER"/>
//从类路径或jar包中搜索并加载properties文件
<context : property-placeholder location="classpath*:*.properties" system-properties-mode="NEVER"/>

后边的标签属性system-properties-mode表示不加载系统属性

容器类层次结构图

在这里插入图片描述
BeanFactory创建完毕后,所有的bean均为延迟加载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值