【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均为延迟加载

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java Web开发中,"bean"通常用来指代封装数据的对象。根据不同的作用和功能,Java中的bean可以有不同的术语。例如,用于接收前端数据并封装成查询对象的称为QO(Query Object),用于表示值对象的称为VO(Value Object),用于对应数据库表的称为PO(Persistent Object),而仅仅作为中间件的简单无规则Java对象则称为POJO(Plain Ordinary Java Object)。 在Java Web开发中,我们常常会使用JavaBean来封装数据,以便在不同的组件和模块中传递和处理数据。JavaBean可以是一个类,具有私有的属性和公共的getter和setter方法,还可以实现一些特定的接口如BeanPostProcessor或FactoryBean等。例如,BeanPostProcessor是一个后置处理器,它提供了在bean初始化方法之前和之后执行一些逻辑的能力。通过实现BeanPostProcessor接口,我们可以在bean初始化之前和之后对bean进行一些自定义的处理操作。 此外,还有一种特殊类型的bean叫做工厂bean(FactoryBean),它是一个用于创建其他bean的bean。工厂bean类实现了FactoryBean接口,并重写了getObject方法用于创建实例。然后,我们可以将工厂bean定义为Spring容器中的一个bean,通过调用getObject方法来获取由工厂bean创建的实例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [JavaWeb开发(三)3.3——Spring Bean详解(基于XML方式)](https://blog.csdn.net/qq_36216193/article/details/128687184)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [JavaWeb中的各种bean](https://blog.csdn.net/weixin_43894879/article/details/110404455)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值