spring日记(三):在Ioc中装配Bean

JavaBean允许大写字母起头的属性变量名,不过必须满足:变量的前两个字母要么全部大写,要么全部小写。比如IDCode,idCode是合法的,尽量用小写的。

》通过构造函数注入:

<!--构造函数注入:type -->
<bean id="car1" class="com.baobaotao.ditype.Car">
	<constructor-arg type="java.lang.String">
		<value>红旗CA72</value>
	</constructor-arg>
	<constructor-arg type="double">
		<value>20000</value>
	</constructor-arg>
</bean>
<!--构造函数注入:type&index,这个最优 -->
<bean id="car3" class="com.baobaotao.ditype.Car">
	<constructor-arg index="0" type="java.lang.String">
		<value>红旗CA72</value>
	</constructor-arg>
	<constructor-arg index="1" type="java.lang.String">
		<value>中国一汽</value>
	</constructor-arg>
	<constructor-arg index="2" type="int">
		<value>200</value>
	</constructor-arg>
</bean>

循环依赖问题:如果两个Bean都通过构造函数注入,并且在构造函数中互相引用对方,那么会出现死锁情况,这种情况下,只能修改构造函数注入方法,改成属性输入。

注入参数详解:

一般来讲,基本数据类型及其封装类、String等类型可以采用字面值注入,就是<value>元素,Spring容器在内部为字面值提供了编辑器,可以将字符串表示的字面值转换为内部变量的相应类型。spring允许用户注册自定义的编辑器,以处理其他类型属性注入时的转换工作。

<bean id="car" class="com.baobaotao.attr.Car" lazy-init="default">
	<property name="brand">
		<value>
			<![CDATA[红旗&CA72]]>
		</value>
	</property>
	<property name="maxSpeed">
		<value>200</value>
	</property>
	<property name="price" value="2000.00" />
</bean>

看到了那个brand属性的字面值没?那是一个特殊的XML符号,<![CDATA[....]]>的作用是让解析器将里面的东东当做普通文本对待,不要解析了,不过这个只能用在<value></value>元素中,如果是直接用简化方式,比如<property name="speed", value="aaa&amp;bb">,只能用后面的转移字符了。或者使用特殊实体符号:<(&lt;)、>(&gt;)&(&amp;)、"(&quot;)、'(&apos;),注意,value里面的空格会连带一起付给这个属性,所以最好不要加空格换行啥的。

现在最优雅的配置方式是使用p命名空间:

<bean id="boss2" class="com.baobaotao.fb.Boss"
       p:name="John" p:car-ref="car2"/>

lookup方法注入(CGLib实现):

适用场景为希望通过一个singleton Bean 获取一个prototype Bean的时候,每次调用方法获取的对象都不一样:

public interface MagicBoss {
    Car getCar();
}

 

<bean id="car" class="com.baobaotao.auto.Car" scope="singleton">
    <property name="brand" value="红旗CA72"/>
    <property name="price" value="2000"/>
</bean> 
<bean id="magicBoss" class="com.baobaotao.auto.MagicBoss">
    <lookup-method name="getCar" bean="car"/>
</bean>

》基于注解的配置:

@Component、@Repository(对DAO)、@Service、@Controller标注POJO类,然后在spring配置文件中引入context命名空间,pom中引入对于的jar包依赖,然后开始扫描:

<context:component-scan base-package="com.springzoo.anno"/>
<context:component-scan base-package="com.springzoo" resource-pattern="anno/*.class"/ >
<context:component-scan base-package="com.springzoo">
       <context:include-filter type="regex" expression="com\.springzoo\.anno.*Dao"/>
       <context:include-filter type="regex" expression="com\.springzoo\.anno.*Service"/>
       <context:exclude-filter type="aspectj" expression="com.springzoo..*Controller+"/>
   </context:component-scan>
所有这些过滤中,aspectj的过滤表达能力最强,它可以轻易实现其他类型所能表达的过滤规则。
》使用@Autowired进行自动注入
package com.baobaotao.anno;
 
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
 
@Service
public class LogonService implements BeanNameAware{
    @Autowired(required=false)
    private LogDao logDao;
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;
}

一般原则:采用XML配置DataSource、SessionFactory等资源Bean,在XML中利用aop、context命名空间进行相关主题的配置。其他所有项目中开发的Bean,都通过基于注解配置的方式进行配置,即整个项目采用“基于XML+基于注解”的配置方式,很少采用基于Java类的配置方式。

 

本人博客已搬家,新地址为:http://yidao620c.github.io/

猜你喜欢

转载自yidao620c.iteye.com/blog/1843311
今日推荐