SpringIOC的创建对象的单例多例模式和自动注入

[1] SpringIOC创建对象的单例和多例模式

问题:

Spring容器对象根据配置文件创建对象的时机默认发生在Spring容器对象在被创建的时候,也就是说,我们一旦获取到Spring容器对象,意味着可以直接获取Spring容器中的对象使用了.那么,如果我对同一个bean对象,连续获取N次,获取到的是不是同一个对象呢?因为spring容器对象底层使用的是map集合存储的bean对象,对map集合按照同一个键名获取数据,获取的是同一个,也就说按照同一个键名从Spring容器中获取的都是同一个对象,那么如果我们希望相同的键名获取的对象每次都不一样,怎么实现?

解决:

不要在Spring容器对象创建的时候,就完成对象的初始化创建,而是变为,从Spring容器中获取的时候才创建,每次获取都重新创建.

实现:

Spring容器的单例和多例模式创建对象. 单例模式(默认):
设置了单例模式的bean,会在Spring容器对象被创建的时候 就完成初始化创建,无论获取多少次都是同一个对象. 多例模式:
设置了多例模式的bean,在Spring容器对象被创建的时候不会被初 始化创建,每次获取的时候都会重新创建,每次获取的对象都不相同.

使用:

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.xsd">

    <!--
    SpringIOC设置对象的单例模式和多例模式创建对象
    单例模式:默认模式,在bean标签上使用scope属性,默认值为singleton
    多例模式:在bean标签上使用scope属性设置,值为prototype
    -->
    <bean id="stu" class="com.java.pojo.Student" scope="singleton"></bean>
    <bean id="tea" class="com.java.pojo.Teacher" scope="prototype"></bean>
</beans>

TestIocModel
package com.java.controller;
import com.java.pojo.User;
import com.java.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.request.async.WebAsyncUtils;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.rmi.CORBA.StubDelegate;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(value = "/user", loadOnStartup = 1)
public class UserServlet extends HttpServlet {
   
    public static void main(String[] args) {
        //获取Spring容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationcontext.xml");
        Student stu =(Student) ac.getBean("stu");
        Student stu2 =(Student) ac.getBean("stu");
        
        Teacher teacher = (Teacher) ac.getBean("stu");
        Teacher teacher2 = (Teacher) ac.getBean("stu");
        System.out.println("学生:"+(stu==stu2));
        System.out.println("教室:"+(teacher==teacher2));
    }
}


[2] SpringIOC的自动注入

问题:

在学习了SpringIOC的DI依赖注入后,我们可以根据对象之间的依赖关系的 责任链,让Spring容器对象帮我们创建有一个组装好的对象,比如A中有B,B 中有C,C中有D.将A,B
,C,D都创建为Bean对象,然后使用ref属性告诉Spring 对象之间的依赖关系的组装规则,假如依赖责任链特别长,使用ref注入就会很 麻烦.怎么办?

解决:

不要声明ref属性来指明依赖关系的注入,只需要告诉Spring容器对象依赖关 系的注入规则,Spring容器对象自动根据规则完成依赖关系的注入.

实现:

①根据bean的ID和属性名一致的规则
②根据bean的类型和属性的类型一致的规则
③根据构造器形参的类型和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"
       default-autowire="byName"><!--设置自动注入-->
    <!--
       自动注入:
       在标签上使用autowire属性设置自动注入规则.该属性声明在要注入资源的bean标签上,比如:学生的bean
         autowire属性的值:
           byName:按照属性名和某个bean的id相同的规则自动注入
           byType:按照属性的类型和某个bean的类型相同的规则自动注入.
               注意:同类型的bean只能有一个,否则报错.
           constructor:
               必须声明对应的构造器,根据构造器形参的类型和某个bean的类型相同的规则自动注入.
           no:不使用自动注入,必须使用ref手动注入.
           default:使用默认注入规则.默认值.
           注意:
                可以在beans顶层元标记中使用属性default-autowire声明全局自动注入规则.
   -->
    <bean id="stu" class="com.java.pojo.Student" autowire="byName">
        <!--用构造器的方法,此处要创建一个只有Teacher一个参数的构造器-->
        <!--<constructor-arg index="0" type="com.Teacher"  ref="tea"></constructor-arg>-->
        <property name="sid" value="1"></property>
        <property name="sname" value="张三"></property>
    </bean>
    <bean id="teacher" class="com.bjsxt.pojo.Teacher">
        <property name="tname" value="liu"></property>
        <property name="tid" value="1"></property>
    </bean>
</beans>
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AloneDrifters

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值