欢迎访问欧博亚洲(Allbet Game)!

首页科技正文

环球ug网址:Spring系列.依赖注入设置

admin2020-06-2743

依赖注入的设置

Spring的依赖注入分为基于组织函数的依赖注入基于setter方式的依赖注入

基于组织函数的依赖注入

        <!-- 通过组织器参数索引方式依赖注入 -->
	<bean id="byIndex" class="cn.javass.spring.chapter3.HelloImpl3">
		<constructor-arg index="0" value="Hello World!"/>
		<constructor-arg index="1" value="1"/>
	</bean>
	<!-- 通过组织器参数类型方式依赖注入 -->
	<bean id="byType" class="cn.javass.spring.chapter3.HelloImpl3">
		<constructor-arg type="java.lang.String" value="Hello World!"/>
		<constructor-arg type="int" value="2"/>
	</bean>
	<!-- 通过组织器参数名称方式依赖注入 -->
	<bean id="byName" class="cn.javass.spring.chapter3.HelloImpl3">
		<constructor-arg name="message" value="Hello World!"/>
		<constructor-arg name="index" value="3"/>
	</bean>
	<!-- 通过静态的工厂方式注入 -->
	<bean id="byName" class="cn.javass.spring.chapter3.HelloImpl3" factory-method="getBean">
		<constructor-arg name="message" value="Hello World!"/>
		<constructor-arg name="index" value="3"/>
	</bean>

基于setter方式的依赖注入

    <bean class="...HelloImpl4">
	    <property name="message" value="Hello"/>
	    <property name="index" value="1"/>  //value中的值全部是字符串形式,若是转换失足会报异常
	</bean>
	<bean id="Hello2" class="com.csx.personal.web.services.HelloImpl2">
		<property name="msg" ref="message"/>  //msg属性是一个类工具
	</bean>

循环依赖:建立Bean A需要Bean B,建立Bean B需要Bean C,建立Bean C需要Bean A 这样就形成了循环依赖。 Spring的解决方案:Spring建立Bean的时刻会维护一个池,在建立A的时刻会去池中查找A是否在池子中,如果发现就抛出循环依赖异常。

制止依赖注入时的循环依赖:可以使用setter方式注入,不要使用组织器形式的注入。

依赖设置常见列子

常量值注入设置

    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <!-- results in a setDriverClassName(String) call -->
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
        <property name="username" value="root"/>
        <property name="password" value="masterkaoli"/>
    </bean>

注入其他Bean

这边划分给出了一个引用当前容器和引用父容器中Bean的列子。

   <bean id="Hello2" class="com.csx.personal.web.services.HelloImpl2">
	<property name="msg">        //msg属性是一个类工具
            <ref  bean="message"/>   //引用同一个容器中id="message"的Bean
       </property>
   </bean>
    
    <!-- 引用父容器中的Bean -->
    <!-- in the parent context -->
    <bean id="accountService" class="com.something.SimpleAccountService">
    <!-- insert dependencies as required as here -->
    </bean>
 
    <!-- in the child (descendant) context -->
    <bean id="accountService" <!-- bean name is the same as the parent bean -->
    class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target">
        <ref parent="accountService"/> <!-- notice how we refer to the parent bean -->
    </property>
    <!-- insert other configuration and dependencies as required here -->
    </bean>

注入内部Bean

内部bean:这种bean一样平常只让某个外部bean使用(和内部类相似),不让容器中的其他Bean使用。

    <bean id="outer" class="...">
        <property name="target">
             <!-- this is the inner bean -->
            <bean class="com.example.Person"> 
                <property name="name" value="Fiona Apple"/>
                <property name="age" value="25"/>
            </bean>
        </property>
   </bean>

聚集的注入

聚集类的注入建议使用util命名空间

    <util:map id="myMap" key-type="java.lang.String" value-type="java.lang.String">
        <entry key="key1" value="chen"/>
        <entry key="key2" value="zhao"/>
    </util:map>

    <util:list id="myList" value-type="java.lang.String">
        <value>chen</value>
        <value>zhao</value>
    </util:list>
    
    <util:set id="mySet" value-type="java.lang.String" scope="singleton">
        <value>chen</value>
        <value>zhao</value>
    </util:set>
    
    <util:properties id="myProp" location="classpath:xx.properties"/>

null值和空字符串的注入

   <bean class="...HelloImpl4">
        <property name="message"><null/></property> //null值
        <property name="index" value=""/>  //空字符串
  </bean>

使用depends-on属性

depends-on属性用来指定bean的初始化顺序。这个属性只对scope是单列的bean生效

    <!--在实例化beanOne之前先实例化manager和accountDao这两个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" />

懒加载

bean的界说中有一个lazy-init这个属性,用来设置单列bean在容器初始化后是否实例化这个bean。默认情形下容器是会实例化所有单例bean的,我们也建议这么做,由于这样能在容器初始化阶段就发现bean设置是否准确。若是一个Bean根据下面的设置,lazy-init被设置为true那么它不会被容器预初始化,只有在被使用的时刻才被初始化。然则若是有一个单列类依赖了这个Bean,那么这个被设置成懒加载的Bean照样会被预初始化。

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

若是想设置全局的单例Bean都不要预先初始化,那么可以在xml中做如下设置:

    <beans default-lazy-init="true">
        <!-- no beans will be pre-instantiated... -->
    </beans>

Autowiring相关

当我们要往一个bean的某个属性里注入另外一个bean,我们会使用property +ref标签的形式。然则对于大型项目,假设有一个bean A被多个bean引用注入,若是A的id由于某种原因修改了,那么所有引用了A的bean的ref标签内容都得修改,这时刻若是使用autowire="byType",那么引用了A的bean就完全不用修改了。

 <!--autowire的用法如下,对某个Bean设置autowire模式 -->
 <!--和给Bean的属性添加@AutoWired注解的效果一致-->
 <bean id="auto" class="example.autoBean" autowire="byType"/>

autowire的几种模式:

  • no模式:也是默认模式,这种模式下不会举行自动属性注入,需要我们自己通过value或者ref属性举行设置;
  • byName模式:通过属性的名称自动装配,Spring会在容器中查找名称与bean属性名称一致的bean,并自动注入到bean属性中。固然bean的属性需要有setter方式。例如:bean A有个属性master,master的setter方式就是setMaster,A设置了autowire="byName",那么Spring就会在容器中查找名为master的bean通过setMaster方式注入到A中;
  • byType:通过类型自动装配(注入)。Spring会在容器中查找类(Class)与bean属性类一致的bean,并自动注入到bean属性中,若是容器中包罗多个这个类型的bean,Spring将抛出异常。若是没有找到这个类型的bean,那么注入动作将不会执行;
  • constructor:类似于byType,然则是通过组织函数的参数类型来匹配。假设bean A有组织函数A(B b, C c),那么Spring会在容器中查找类型为B和C的bean通过组织函数A(B b, C c)注入到A中。与byType一样,若是存在多个bean类型为B或者C,则会抛出异常。但时与byType差别的是,若是在容器中找不到匹配的类的bean,将抛出异常,由于Spring无法挪用组织函数实例化这个bean;
  • default : 接纳父级标签(即beans标签的default-autowire属性)的设置。

需要注重的是上面这5中方式注入都需要我们提供响应的setter方式,通过@Autowired的方式不需要提供响应的setter方式。

自动装配的瑕玷

  • 属性和组织函数参数设置中的显式依赖项会笼罩自动装配;

将Bean清扫自动装配

若是根据下面的方式设置了Bean,那么这个Bean将不会作为自动装配的候选Bean。然则autowire-candidate自会对byType形式的自动注入生效,若是我们是通过byName的形式举行自动注入,那么照样能注入这个Bean。

    <bean id="auto" class="example.autoBean" autowire="byType" autowire-candidate="false"/>

若是我们只想让某些Bean作为自动装配的候选Bean,那么可以举行全局设置。若是做了下面的设置,那么只有id为bean1和bean2的Bean才会成为自动装配的候选Bean。同时default-autowire-candidates的值支持正则表达式形式。然则强烈建议不要设置这个选项的值,使用默认的设置就行。

    <beans default-autowire-candidates="bean1,bean2">
    </beans>

方式注入(单例依赖原型Bean)

我们在设置bean的时刻首先要思量这个bean是要设置成单例模式照样其他模式。 在我们的应用中,绝大多数类都是单例类。当单例类引用单例类,或者原型类引用原型类、单例类时,我们只要像通俗的设置方式就行了。然则当一个单例类引用原型类时,就会出现问题。这种情形可以使用下面的方式举行注入。

   @Service
   @Scope("prototype")
   public class MyService1 {
public void service() {
   System.out.println(this.toString() + ":id");
}
	}
	
	@Service
public abstract class MyService {

    private MyService1 service1;
    public void useService(){
     service1 = createService1();
     service1.service();
    }

    @Lookup("myService1")
    public abstract MyService1 createService1();

}
	
//也可以这样设置bean
<bean id="serviceC" class="com.csx.demo.springdemo.service.ServiceC">
    <lookup-method bean="serviceD" name="createService"/>
</bean>
<bean id="serviceD" class="com.csx.demo.springdemo.service.ServiceD"     scope="prototype"/>
,

联博以太坊高度

www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源:欧博亚洲(Allbet Game)!

本文链接:https://www.mingjiumingcha.com/post/893.html

网友评论

1条评论
  • 2020-06-27 00:13:18

    ALLBET官网娱乐平台开户欢迎进入ALLBET官网娱乐平台开户:www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。一直在看哦

最新评论

  • 欧博官网手机版 10/22 说:

    Allbet Gmaing欢迎进入欧博Allbet官网(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。没有华丽辞藻,就一个好!

  • 欧博官网手机版 10/22 说:

    Allbet Gmaing欢迎进入欧博Allbet官网(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。没有华丽辞藻,就一个好!

  • 皇冠APP下载 10/22 说:

    Allbet手机版下载欢迎进入Allbet手机版下载(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。我就看看不说话

  • ALLBET官网官方注册 10/22 说:

    欧博亚洲欢迎进入欧博亚洲(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。再多点这种文

  • 环球UG注册 10/22 说:

    apple developer enterprise account for rentproviding apple enterprise developer accounts for rent, rent your own enterprise account for app signing. with high quality, stable performance and affordable price.挺优秀的一个作者

  • 环球UG注册 10/21 说:

    Allbet Gmaing代理欢迎进入Allbet Gmaing代理(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。我是死忠粉了

  • allbet在线 10/21 说:

    联博接口www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。跟期待的一样

  • UG环球客户端 10/21 说:

    欧博代理欢迎进入欧博代理(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。还是熟悉的感觉