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&bb">,只能用后面的转移字符了。或者使用特殊实体符号:<(<)、>(>)&(&)、"(")、'('),注意,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>
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/