Spring学习总结3(bean的属性详解)

    技术2022-05-20  41

    id - 命名

    id在当前IoC容器中必须唯一。同一个应用下的不同配置文件中,也不可重名。

    bean的命名采用标准的Java命名约定,即小写字母开头,首字母大写间隔的命名方式

     

    name - 别名

    对一个id为"componentA-dataSource"的bean,定义了2个不同的别名

     

    <alias name="componentA-dataSource" alias="componentB-dataSource"/> <alias name="componentA-dataSource" alias="myApp-dataSource" /> <bean id="componentB" class="com.bjsxt.service.UsercomponentB"> <property name="dataSource" ref="componentB-dataSource" /> </bean> <bean id="myApp" class="com.bjsxt.service.UsermyApp"> <property name="dataSource" ref="myApp-dataSource" /> </bean>   

     

    factory-method和factory-bean - 手动指定创建类实例的工厂方法和工厂所在的类

    <bean id="serviceLocator" class="com.foo.DefaultServiceLocator"> <!-- inject any dependencies required by this locator bean --> </bean> <!-- the bean to be created via the factory bean --> <bean id="exampleBean" factory-bean="serviceLocator" factory-method="createInstance"/> <!-- 创建bean的工厂就在该bean中 --> <bean id="exampleBean" class="examples.ExampleBean2" factory-method="createInstance"/>

     

     

    depends-on - 初始化依赖当前bean初始化之前显式地强制一个或多个bean被初始化

    <bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao"> <property name="manager" ref="manager" /> </bean> <bean id="manager" class="ManagerBean" /> <bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />

     

     

    lazy-init - 延迟初始化

    ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化。提前实例化意味着作为初始化过程的一部分,ApplicationContext实例会创建并配置所有的singleton bean。通常情况下这是件好事,因为这样在配置中的任何错误就会即刻被发现(否则的话可能要花几个小时甚至几天)。

    一个延迟初始化bean将告诉IoC 容器是在启动时还是在第一次被用到时实例化。

    <bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>

     

    <!-- 该配置下的所有bean全部延迟加载 --> <beans default-lazy-init="true"> <!-- no beans will be pre-instantiated... --> </beans>

     

     

     

    autowire - 自动装配

    byName

    根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。

    byType

    如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。

    constructor

    byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。

    autodetect

    通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。

     

    将bean排除在自动装配之外

     autowire-candidate=false

     

    将bean设为自动装备的首选

    primary=true

     

    scope - 生命周期

    1.singleton  (默认属性)

    Spring将Bean放入Spring IOC容器的缓存池中,并将Bean引用返回给调用者,spring IOC继续对这些Bean进行后续的生命管理。BeanFactory只管理一个共享的实例。所有对这个特定bean的实例请求,都导致返回这个唯一bean实例的引用。

    即每次拿到的对象都是引用的同一个地址的对象。当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。

    2.prototype

    Spring将Bean返回给调用者,调用者负责Bean后续生命的管理,Spring不再管理这些Bean的生命周期。 每次对这个bean的实例请求都会导致一个新的实例的创建。当用户需要不受其他用户对象影响的对象或有类似的需求时,这是一个较理想的解决办法。 

     

     

    3.request

    ‍request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效,配置实例: request、session、global session使用的时候首先要在初始化web的web.xml中做如下配置:如果你使用的是Servlet 2.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可:

    ‍<listener>   <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class></listener>

     

     

    4.session

     

     

     

    5.globalsession

    ‍global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean,那么web会自动当成session类型来使用

     

     

    对于Action来说需要指明scope=”prototype”或singleton=”false”,因为Action是线程不安全的,可能会导致跳转的页面错误。

    对于带有数据成员变量的类需要指明scope=”prototype”或singleton=”false”。不然这样会导致多个线程共用同一个成员变量。

     

    有状态的bean都使用Prototype作用域,而对无状态的bean则应该使用singleton作用域。

     

    ‍session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效

     

    即每次拿到的对象都是引用的不同地址的对象。相当于一个new的操作。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责

     

    以下的3种scope都使用的较少,类似于J2EE里面的request和session。在使用SpringMVC是可能会用到。


    最新回复(0)