spring中IOC控制反转

概念

IOC----控制反转 意思就是将对象的创建权力交给spring 提前在spring容器中构建好了spring对象,如此我们可以通过spring 容器直接调用getBean("name属性或者ID名称”)----》获取对应的对象

需要使用到的类

  1. ApplicationContext

    使用它需要借助于他的实现类 ClassPathXmlAppliCationContext ,默认会在创建的时候将内部的配置对象全部加载到Spring容器当中.

  2. ClassPathXmlAppliCationContext

    将来我们可以从ClassPath目录下加载到我们的Spring主配置文件.

Bean元素的配置和创建

凡是交给Spring容器管理的对象,都可以通过Bean元素进行配置,Spring的本质就是对象管理容器,就是拿来管理对象的,底层就是使用Map来存储对象的.

1,name和class属性

  • name属性:作用就是给创建的对象起一个名字,将来在应用中我们是通过这个名字获取这个对象,name属性值可以重复,但是设置的时候一般也是设置为唯一的。
  • class属性:创建该对象映射的哪个类, 反射机制 , 全路径 = 包名 + 类名
  • id属性: id1属性和name属性的作用几乎是一样的 但是id值不能重复 并且 id属性值里面不能含有特殊字符。
    代码演示
<!--通过标识id找到对象,配置UserDaoImpl类到容器里面.-->
    <!--目的就是提前配置好,到时候不用去new对象直接从这里面得到就可以了    就是通过反射过来的-->
    <bean id="userDao" class="com.zhiyou100.dao.impl.UserDaoImpl"></bean>

2.bean元素的创建

1.空参构造
bean元素的创建,默认就是采用空参构造来的,如果没有空参构造,那么就会报错
空参构造分为单例模式和多例模式
单例模式:一个对象被创建,调用多少次都是同一个对象 bean中加属性scope=singleton
多例模式:一个对象被创建,每使用一次就调用一次 bean中加属性scope=prototype
代码演示


    <!--备案元素的创建-->
    <!--方式一: 空参构造创建   user  --><!--经常使用的是这个方式-->
    <!-- id:以后使用后这个bean就调用id值   class:就是指定兑现故事呢一个类的  -->
    <bean id="user" class="com.zhiyou100.pojo.User" scope="singleton"></bean>

    <!--多例模式-->
    <bean id="user1" class="com.zhiyou100.pojo.User" scope="prototype"></bean>

bean元素的生命周期

初始化:init-method()
先初始化在创建对象
销毁:destroy-method()
第一:长期不使用就会自动销毁
第二:容器销毁或者关闭的时候,存储在容器里面的bean对象就会销毁
bean元素是交给spring来管理的,如果吧bean元素的scope设置为多例模式,那么就只关产生不管销毁

    <!--初始化方法 init-method     销毁方法  destroy-method="destroyUser"    -->
    <bean id="user2" class="com.zhiyou100.pojo.User" init-method="initUser" destroy-method="destroyUser"></bean>

2.对象创建第二种方式:静态工厂方式

<!--方式二:静态工厂方式  factory-method:指定当前应用类中的静态方法  -->
    <bean id="userStatic" class="com.zhiyou100.pojo.BeanFactory" factory-method="getStaticBean"></bean>

3.对象创建第三种方式:实例工厂方式

    <!--方式三:实例工厂方式   第二个的 factory-bean 对应 第一个的 name    第二个的name才是测试类里免得标识。
        在  第二个的 factory-bean 对应 第一个的 name 对应的时候   factory-method  才能找到我们想要的方法。
      -->
    <bean name="userBeanFactory" class="com.zhiyou100.pojo.BeanFactory"></bean>
    <bean name="userFactory" factory-bean="userBeanFactory" factory-method="getUser"></bean>

scope属性

​ scope 范围区域的意思 spring中,作用是设置bean元素创建对象的方式

  • singleton 表示单例模式 容器中的对象有且只有一个 如果设置了单例模式 表示当前的对象在容器中只会创建一次,创建了之后,去测试类里面调用,调用多少次都是同一个对象 如果在主配置文件里面再去给这个了配置一个对象,那么就是两个不同的对象 在Spring中默认就是采用的单例模式

  • prototype 表示多例模式 使用一次就构建一个新的对象 在 structs2 框架容器中就是默认独立模式的。

    单例模式的时候,都是随着主配置文件的创建,对象全部加载 但是多例模式的时候是随用随加载,对象被创建出来了,但是没有被架子啊

  • request 在请求域中

  • session 会话 子啊服务器中

  • globalSession 全局的,跨越session存储的。
    以上xml配置对应的接口,实现类,和测试类的代码
    实体类User代码

//写上全参,无参,set  get  toString
public class User implements Serializable {

    private Integer id;
    private String username;
    private String address;
    private Date birthday;
    private boolean gender;

实体类工厂(静态工厂和实例工厂会用到)

 //静态方式,需要借助静态方法
    public static User getStaticBean(){
        System.out.println("采用的是静态方式创建对象");
        return new User();
    }


    //成员方法
    public User getUser(){
        System.out.println("采用的是实例工厂方式创建");
        return new User();
    }

User测试类

public class BeanCreateTest {


    /**
     * 空参构造创建Bean元素
     */

    @Test
    public void testCreataBean(){
        //第一步:完成了对主配置文件applicationContext.xml的加载
        ApplicationContext container = new ClassPathXmlApplicationContext("applicationContext.xml");
        //第二步:从容器中获得想要的对象,user对应bean里面的id值
        User user = container.getBean("user", User.class);
        System.out.println(user);
    }
    /**
     * 静态工厂方式创建Bean元素
     */
    @Test
    public void testStaticBean(){
        //第一步:完成了对主配置文件applicationContext.xml的加载
        ApplicationContext container = new ClassPathXmlApplicationContext("applicationContext.xml");
        //第二步:从容器中获得想要的对象,user对应bean里面的id值  User.class  是指定映射方式
        User user = container.getBean("userStatic", User.class);
        System.out.println(user);
    }
    /**
     * 实例工厂方式创建Bean元素
     */

    @Test
    public void testInstanceBean(){
        //第一步:完成了对主配置文件applicationContext.xml的加载
        ApplicationContext container = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        //第二步:从容器中获得想要的对象,user对应bean里面的id值  User.class  是指定映射方式
        User user = container.getBean("userFactory", User.class);
        System.out.println(user);
    }

    /**
     * 单例模式下,。创建Bean元素,
     */
    @Test
    public void testSingletn(){
        //第一步:完成了对主配置文件applicationContext.xml的加载
        ApplicationContext container = new ClassPathXmlApplicationContext("applicationContext.xml");

        //第二步:从容器中获得想要的对象,user对应bean里面的id值
        User user = container.getBean("user", User.class);
        User user1 = container.getBean("user", User.class);
        System.out.println(user == user1);
    }
    /**
     * 多例模式下,。创建Bean元素,
     */

    @Test
    public void testPrototype(){
        //第一步:完成了对主配置文件applicationContext.xml的加载
        ApplicationContext container = new ClassPathXmlApplicationContext("applicationContext.xml");

        //第二步:从容器中获得想要的对象,user对应bean里面的id值
        User user = container.getBean("user1", User.class);
        User user1 = container.getBean("user1", User.class);
        System.out.println(user == user1);
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值