Spring的Bean你了解吗

Bean的配置

Spring容器支持XML(常用)和Properties两种格式的配置文件

Spring中XML配置文件的根元素是,中包含了多个子元素,每个子元素定义了一个Bean,并描述了该Bean如何装配到Spring容器中

元素包含了多个属性以及子元素,常用属性及子元素如下所示

|-----------------|----------------------------------------------------------------------------------------------------------------------|
| id | 是一个Bean的唯一标识,Spring容器对Bean的配置、管理都有这个属性完成 |
| name | Spring容器同样可以通过此属性对容器中的Bean进行配置和管理,name属性可以为Bean指定多个名称、每个名称之间用逗号或分号隔开 |
| class | 该属性制定了Bean的具体实现类,它必须是一个完整的类名,使用类的全限定名 |
| scope | 用来设定Bean实例的作用域 |
| constructor-arg | 元素的子元素,可以使用此元素传入构造参数进行实例化。 该元素的index属性指定构造参数的序号(从0开始), type属性指定构造参数的类型, 参数值可以通过ref属性或value属性直接指定,也可以通过ref或value子元素指定 |
| property | 元素的子元素,用于调用Bean实例中的setter方法完成属性赋值,从而完成依赖注入。该元素的name属性指定Bean实例中的相应属性名。 ref属性或value属性指定参数值 |
| ref | 、等元素的属性或子元素,可以用于指定Bean工厂中某个Bean的实例引用 |
| value | 、等元素的属性或子元素。可以用于直接指定一个常量值 |
| list | 用于封装List或数组类型的依赖注入 |
| set | 用于封装Set类型属性的依赖注入 |
| map | 用于封装Map类型属性的依赖注入 |
| entry | 元素的子元素,用于设置一个键值对 |

注意:如果Bean中未指定id和name,Spring会将class值当作id

例子:

<?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-4.3.xsd"> 
           
             <bean id="userDao" class="com.aqiuo.UserDaoImp" />
             
             
             <bean id="userService" class="com.aqiuo.UserServiceImp">
                 <property name="userDao" ref="userDao"></property>
             </bean>
            
</beans>

Bean的实例化

构造器实例化:

构造器实例化是指Spring容器通过Bean对应类中默认的的无参构造函数来实例化Bean。

静态工厂方式实例化:

开发者创建一个静态工厂方法来创建Bean的实例,其Bean配置的class属性所指定的不再是Bean实例的实现类,而是静态工厂类。同时,需要使用factory-method属性来指定所创建的静态工厂方法。

package com.aqiuo.Static_Factory;

public class Bean2 {
    

}

//静态工厂
public class MyBean2Factory {
    public static Bean2 createBean2() {
        return new Bean2();
    }
}
//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"
                    xsi:schemaLocation="http://www.springframework.org/schema/beans 
           
                    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"> 
           
        //id还是bean的id class指定对应的工厂实现类 factory-method指定工厂方法
           <bean id="bean2" class="com.aqiuo.Static_Factory.MyBean2Factory" factory-method="createBean2">
                 
             </bean>
</beans>
//测试

实例工厂方式实例化

采用直接创建Bean的实例,同时在配置文件中,需要的实例化Bean也不是通过class属性直接指向实例化类,而是通过factory-bean书性指向配置的实例工厂,然后使用factory-method属性指定使用工厂的哪个方法

public class MyBean3Factory {
    
    public MyBean3Factory() {
        System.out.println("Bean3工厂实例化...");
        
    }
    public Bean3 createBean3() {
        return new Bean3();
    }
}

       
       
       <!--实例工厂-->
        <bean id="myBean3Factory" class="com.aqiuo.Instance_factory.MyBean3Factory" scope="prototype">
        </bean>
        <!-- factory-bean指定配置的实例工厂  factory-method指定工厂的哪个方法 -->
           <bean id="bean3" factory-bean="myBean3Factory" factory-method="createBean3">
          </bean>

Bean的作用域

|---------------|------------------------------------------------------------------------------|
| singleton(默认) | 使用ta定义的Bean在Spring容器中将只有一个实例,无论多少个bean引用它都指向同一个对象 |
| prototype | 每次通过Spring容器获取的prototype定义的bean时,容器都创建一个新的Bean实例 |
| request | 在一次HTTP请求中,容器会返回Bena的同一个实例,不同Http请求会产生新的Bean,该Bean仅在当前HTTP Request内有效 |
| session | 在一次HTTPSession请求中,容器会返回Bena的同一个实例,不同Http请求会产生新的Bean。该Bean仅在当前HTTP Session内有效 |
| globalSession | |
| application | |
| websocket | |

Bean的生命周期

Bean的装配方式:

xml配置

setter配置(先调用默 认无参构造函数实力化对象,然后通过反射方式调用setter方法注入属性)

要求:

Bean类必须有一个默认无参构造方法

Bean类必须为需要注入的属性提供对应的setter方法

构造器配置

要求:

Bean类必须有一个有参构造方法

       //setter注入
       <bean id="user1" class="com.aqiuo.User.User">
             <property name="username" value="冉雨珊"></property>
             <property name="password" value="张宇"></property>
             <property name="list">
                 <list>
                 <value>1</value>
                 <value>2</value>
                 <value>3</value>
                 </list>
             </property>
         </bean>
         //构造器注入
         <bean id="user2" class="com.aqiuo.User.User">
             <constructor-arg index="0" value="rys"></constructor-arg>
             <constructor-arg index="1" value="zy"></constructor-arg>
             <constructor-arg index="2">
                 <list>
                     <value>qq</value>
                     <value>bb</value>
                     <value>mm</value>
                 </list>
             
             </constructor-arg>
             
         </bean>
         
         <bean id="student" class="com.orz.spring.bean.Student">
                 <property name="name" value="李华"/>
                 <property name="map">
                  <map>
                       <entry key="key1" value="数据库原理"/>
                       <entry key="key2" value="java编程"/>
                  </map>       
                  </property>
          </bean>

自动装配

元素的autowire属性

|-------------|---|
| default | |
| byName | |
| byType | |
| constructor | |
| no | |

注解配置

注解

|------------|-----------------------------------------------------------|
| Component | 此注解可以描述Spring中的bean,泛化的概念,仅仅表示一个组件(Bean) |
| Repository | 用于将数据访问层(DAO层)的类标识为Spring中的bean |
| Service | 通常作用在业务层(Service层),用于将业务层的类标识为Spring中的bean |
| Controller | 通常作用在控制层,用于将控制层的类标识为Spring中的Bean |
| Autowired | 用于对bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作 |
| Resource | 默认按照Bean实例名称进行装配,name解析为bean名称,type属性解析为Bean实例类型 |
| Qualifier | 与@Autowired注解配合使用,会将默认按Bean类型装配修改为按Bean实例名称装配。 |

注意:Spring 4.0以上版本使用上面的代码对指定包中注解进行扫描前,需要先向项目中导入SpringAOP的jar包,否则会爆出错误

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
         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-4.3.xsd 
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd " > 
          
         扫描包下的注解
         <context:component-scan base-package="com.aqiuo.annotation.*" /> 
       
   
</beans>
相关推荐
一只淡水鱼661 小时前
【mybatis】基本操作:详解Spring通过注解和XML的方式来操作mybatis
java·数据库·spring·mybatis
Q_19284999063 小时前
基于Springcloud的智能社区服务系统
后端·spring·spring cloud
Ch.yang5 小时前
【Spring】 Bean 注入 HttpServletRequest 能保证线程安全的原理
java·spring·代理模式
昙鱼5 小时前
springboot创建web项目
java·前端·spring boot·后端·spring·maven
爱学习的白杨树6 小时前
MyBatis的一级、二级缓存
java·开发语言·spring
中草药z6 小时前
【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)
java·数据库·spring boot·spring·bean·源码阅读
m0_748256786 小时前
SpringBoot 依赖之Spring Web
前端·spring boot·spring
组合缺一6 小时前
Solon v3.0.5 发布!(Spring 可以退休了吗?)
java·后端·spring·solon
栗豆包7 小时前
w118共享汽车管理系统
java·spring boot·后端·spring·tomcat·maven
武昌库里写JAVA13 小时前
【MySQL】7.0 入门学习(七)——MySQL基本指令:帮助、清除输入、查询等
spring boot·spring·毕业设计·layui·课程设计