Spring(玩转bean的作用域和自动装配!)

高斋晓开卷,独共圣人语。这篇文章主要讲述Spring:玩转bean的作用域和自动装配!相关的知识,希望能为你提供帮助。
一、bean的作用域

Spring(玩转bean的作用域和自动装配!)

文章图片

  • 在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。
  • 简单地讲,bean就是由IoC容器初始化、装配及管理的对象 .
  • 实体类:
public class Person { private String name; private int age; private String like; private String high; }

1.1、Singleton:单例
①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"> < bean id="person" class="dyj.entity.Person" scope="singleton"> < property name="like" value="https://www.songbingjia.com/android/钓鱼"/> < property name="age" value="https://www.songbingjia.com/android/23"/> < property name="name" value="https://www.songbingjia.com/android/丁大大"/> < /bean> < /beans>

②测试类:
public class Test { public static void main(String[] args) { ApplicationContext Context = new ClassPathXmlApplicationContext("ContextAplication.xml"); Person person1 =Context.getBean("person",Person.class); Person person2 =Context.getBean("person",Person.class); System.out.println(person1.hashCode()); System.out.println(person2.hashCode()); System.out.println(person1==person2); } }

③执行结果如下:
Spring(玩转bean的作用域和自动装配!)

文章图片

④总结:
  • scope为singleton时,Spring容器里面有且只有一个实例。
  • 不管你是否使用了该实例,在容器启动时就已经创建好了。
1.2、Prototype:原型
①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"> < bean id="person" class="dyj.entity.Person" scope="prototype"> < property name="like" value="https://www.songbingjia.com/android/钓鱼"/> < property name="age" value="https://www.songbingjia.com/android/23"/> < property name="name" value="https://www.songbingjia.com/android/丁大大"/> < /bean> < /beans>

②测试类:
public class Test { public static void main(String[] args) { ApplicationContext Context = new ClassPathXmlApplicationContext("ContextAplication.xml"); Person person1 =Context.getBean("person",Person.class); Person person2 =Context.getBean("person",Person.class); System.out.println(person1.hashCode()); System.out.println(person2.hashCode()); System.out.println(person1==person2); } }

③执行结果:
Spring(玩转bean的作用域和自动装配!)

文章图片

【Spring(玩转bean的作用域和自动装配!)】④总结:
  • 当scope为prototype时,一个bean对应多个对象实例!
  • 在我们启动容器时并没有实例化,只有在使用时才会在Spring容器里实例化!
1.3、Request(只需了解)
  • 当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:
< bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>

  • 针对每次HTTP请求,Spring容器会根据loginAction bean的定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。
1.4、Session(只需了解)
  • 当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:
< bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

  • 针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样,可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。
二、Bean的自动装配 1.0、环境搭建
①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"> < bean id="car" class="dyj.entity.Car"/> < bean id="house" class="dyj.entity.House"/> < bean id="person" class="dyj.entity.Person"> < property name="car" ref="car"/> < property name="house" ref="house"/> < property name="like" value="https://www.songbingjia.com/android/钓鱼"/> < property name="age" value="https://www.songbingjia.com/android/23"/> < property name="name" value="https://www.songbingjia.com/android/丁大大"/> < /bean> < /beans>

②实体类:
public class Car { public void getName(){ System.out.println("我是一辆车!"); } }

public class House { public void getName(){ System.out.println("我是一栋房子!"); } }

public class Person { private Car car; private House house; private String name; private int age; private String like; private String high; }

③测试类:
public class Test { public static void main(String[] args) { ApplicationContext Context = new ClassPathXmlApplicationContext("ContextAplication.xml"); Person person =Context.getBean("person",Person.class); person.getCar().getName(); person.getHouse().getName(); } }

④执行结果:
Spring(玩转bean的作用域和自动装配!)

文章图片

⑤总结:
  • 搭建完成。
  • 可正常注入Bean。
1.1、byName:按名称自动装配
①修改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"> < bean id="car" class="dyj.entity.Car"/> < bean id="house" class="dyj.entity.House"/> < bean id="person" class="dyj.entity.Person" autowire="byName"> < property name="like" value="https://www.songbingjia.com/android/钓鱼"/> < property name="age" value="https://www.songbingjia.com/android/23"/> < property name="name" value="https://www.songbingjia.com/android/丁大大"/> < /bean> < /beans>

②执行结果:
Spring(玩转bean的作用域和自动装配!)

文章图片

③总结:
  • 证明可以通过 autowire="byName" 根据名称来自动装配!
  • 前提是:bean 的值和实体类中的属性名一致!
1.2、byType:按类型自动装配
①修改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"> < bean class="dyj.entity.Car"/> < bean class="dyj.entity.House"/> < bean id="person" class="dyj.entity.Person" autowire="byType"> < property name="like" value="https://www.songbingjia.com/android/钓鱼"/> < property name="age" value="https://www.songbingjia.com/android/23"/> < property name="name" value="https://www.songbingjia.com/android/丁大大"/> < /bean> < /beans>

②执行结果:
Spring(玩转bean的作用域和自动装配!)

文章图片

③总结:
  • 跟bean中的id无关,可去除!
  • 同一个bean只能有一个,否则报错!
1.3、contructor:构造器自动装配、ref:缺省情况下手动创建
  • 前面已经讲解过了!

    推荐阅读