第2章 IOC-高级配置(1课时)

面试题 https://blog.csdn.net/a745233700/article/details/80959716

第4节

Bean其他高级配置

Bean的作用域 scope

1)singleton (单例 默认)

<bean id="simplePropertyDemo1" class="com.neuedu.spring.chap02.SimplePropertyDemo">
       <constructor-arg name="userName" value="root"></constructor-arg>
       <constructor-arg name="password" value="123456"></constructor-arg>
    </bean>

测试类

 @Test
    public void test1(){
   
       ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml");
       SimplePropertyDemo spd=(SimplePropertyDemo) ctx.getBean("simplePropertyDemo1");
   System.out.println(spd);
   SimplePropertyDemo spd2=(SimplePropertyDemo) ctx.getBean("simplePropertyDemo1");
   System.out.println(spd2);
          }

打印结果

          com.neuedu.spring.chap02.SimplePropertyDemo@42eca56e
          com.neuedu.spring.chap02.SimplePropertyDemo@42eca56e

2)prototype (多例)
有状态bean时使用(每次都需要新创建一个bean时)
同样是上面的例子,我稍加改动,把bean定义里加一个scope="prototype"(多例)
打印结果如下

com.neuedu.spring.chap02.SimplePropertyDemo@42eca56e
com.neuedu.spring.chap02.SimplePropertyDemo@192d3247

总结

Spring容器中的bean可以分为5个范围:

(1)singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。

(2)prototype:为每一个bean请求提供一个实例。

(3)request:为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。

(4)session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。

(5)global-session:全局作用域,global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作用域与Servlet中的session作用域效果相同

什么时候用多例:1是有状态bean 2是对性能要求比较高时

bean的延迟加载(懒加载)

lazy-init:default ,false ,true 默认为defalut=false false:不延迟初始化

lazy-init:defalut和false 不懒 容器启动时就加载
lazy-init:true 懒 现用现加载

lazy-init结合scope=singleton使用
scope="singleton" lazy-init="default" -->说明:容器加载就实例化对象
scope="singleton" lazy-init="true" -->说明:当使用到该对象的时候,实例化该对象
scope="singleton" lazy-init="false" 立即加载,表示在spring启动时,立刻进行实例化。

注意:如果一个bean的scope属性为scope="pototype"时(设置为多例时),即使设置了lazy-init="false"(不懒,应该启动就应该加载),容器启动时也不实例化bean,而是调用getBean方法时才实例化
scope="pototype" 这个属性值不受lazy-init的影响

一句话:只有单例情况下,lazy-init才有效

Bean的生命周期方法

.init-method属性指定初始化时执行的方法,distory-method属性指定bean销毁时执行的方法。

验证结果:如果在bean里全局配置了初始化方法和销毁方法,那么bean加载时如果存在相应的方法会调用,如果不存在会报错。

https://blog.csdn.net/houyanhua1/article/details/81950442

    public class LiveDemo {
        public void init() {
            System.out.println("init方法调用");
        }
    
        public LiveDemo() {
            super();
            System.out.println("构造方法调用");
        }
    
        public void destory() {
            System.out.println("destory方法调用");
        }
    
        public void add() {
            System.out.println("add方法调用");
        }
    }

<bean id="liveDemo" class="springstudy.LiveDemo" init-method="init" destroy-method="destory"/>

@Test
public void test03(){
    ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
    LiveDemo ld=ac.getBean("liveDemo",LiveDemo.class);
    ld.add();
    ac.close();
    
}
image.png

注意:1、ClassPathXmlApplicationContext 类才有close方法
2、执行顺序:构造 方法-init-中间服务的方法-destory方法

全局初始化方法和销毁方法在beans里配置

<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" default-init-method="init" default-destroy-method="destroy">

验证结果:如果在beans里全局配置了初始化方法和销毁方法,那么bean加载时如果存在相应的方法会调用,如果不存在也不报错。

bean的继承(了解)

简单实例

    <bean id="parent1" class="com.neuedu.pojo.User">
     <property name="password" value="123456"></property>
    </bean>
    <bean id="user1" class="com.neuedu.pojo.User" parent="parent1">
       <property name="name" value="zzf"></property>
    </bean>
     <bean id="user2" class="com.neuedu.pojo.User" parent="parent1">
       <property name="name" value="lwk"></property>
    </bean>

多个配置文件

第一种:数组方式
String[] configLocations = new String[]{“spring/applicationContext-dao.xml”,“spring/applicationContext-service.xml”,“spring/applicationContext-trans.xml”};
ApplicationContext ac = new ClassPathXmlApplicationContext(configLocations);

第二种:* 匹配
ApplicationContext ac=new ClassPathXmlApplicationContext("classpath:applicationContext-.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">
<import resource="bean1.xml"/>
<import resource="bean2.xml"/>
......
</beans>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容