IOC和AOP使用拓展

多种方式实现依赖注入 构造注入

编写测试类

public class UserServiceImpl implements UserService { // 声明接口类型的引用,和具体实现类解耦合 private UserDao dao; // 无参构造 public UserServiceImpl() { } // 用于为dao属性赋值的构造方法 public UserServiceImpl(UserDao dao) { this.dao = dao; } public void addNewUser(User user) { // 调用用户DAO的方法保存用户信息 dao.save(user); } }

在使用设值注入时,Spring通过JavaBean无参构造方法实例化对象,当我们编写带参构造方法后,java虚拟机不会再提供默认的无参构造方法,为了保证使用的灵活性,建议自行添加一个无参构造方法
配置文件代码如下:

<?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 "> <!-- 定义UserDaoImpl对象,并指定id为userDao --> <bean /> <!-- 定义UserServiceImpl对象,并指定id为userService --> <bean> <!-- 通过定义的单参构造为userService的dao属性赋 值 --> <constructor-arg> <!-- 引用id为userDao的对象为userService的dao属性赋值 --> <ref bean="userDao" /> </constructor-arg> </bean> </beans>

1、一个

constructor-arg节点下的四个属性

index是索引,指定注入的属性,从0开始,如:0代表personDao,1代表str属性;

type是指该属性所对应的类型,如Persondao对应的是com.aptech.dao.PersonDAO;

ref 是指引用的依赖对象;

value 当注入的不是依赖对象,而是基本数据类型时,就用value;

比如:

<bean> <constructor-arg index="1"> <value>Rod</value> </constructor-arg> <constructor-arg index="0"> <value>世界上有10种人</value> </constructor-arg> </bean> 使用p命名空间实现属性注入

p命名空间的特点:使用属性而不是子元素的形式配置Bean的属性,从而简化了配置代码
语法:
对于直接量(基本数据类型、字符串)属性:p:属性名="属性值"
对于引用Bean的属性:p:属性名-ref="Bean的id"
使用前先要在Spring配置文件中引入p命名空间

xmlns:p="http://www.springframework.org/schema/p"

示例:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans "> <!-- 使用p命名空间注入属性值 --> <bean p:username="皮皮" p:age="21" p:email="pipi@anxin.com" /> <bean /> <bean p:dao-ref="userDao" /> </beans> 注入不同数据类型 注入直接量

  使用

<bean> <property> <value>张三</value> </property> <property> <value>23</value> </property> </bean>

如果属性值中包含了XML文件的特殊字符(& < > " '),则注入需要进行处理,通常可以采用两种办法,使用<[CDATA[]]>标记或把特殊字符替换为实体引用.

<bean> <!-- 使用<![CDATA[]]>标记处理XML特 殊字符 --> <property> <value><![CDATA[P&G]]></value> </property> <!-- 把XML特殊字符替换为实体引用 --> <property> <value>P&amp;G</value> </property> <bean> 符号 实体引用
<   & lt;  
>   & gt;  
&   & amp;  
'   & apos;  
"   & quot;  

注意:在XML文件中字符"<"和“&”是非法的,其他3个符号是合法的,但是将它们替换为实体引用是个好习惯

引用其他Bean组件

Spring中定义的Bean可以互相引用,从而建立依赖关系,除了使用ref属性,还可以通过

<bean/> <bean> <property> <ref bean="userDao"/> </property> </bean>

使用内部Bean

<!-- 定义内部Bean --> <bean> <property> <bean/> </property> </bean>

这样这个UserDaoImpl类型的Bean就只能被userUservice使用,其他的Bean则无法使用

注入集合类型的属性

对于List或数组类型的属性,可以使用

<!-- 注入List类型 --> <property> <list> <!-- 定义List中的元素 --> <value>足球</value> <value>篮球</value> </list> </property> <!-- 注入Map类型 --> <property> <map> <!-- 定义Map中的键值对 --> <entry> <key> <value>football</value> </key> <value>足球</value> </entry> <entry> <key> <value>basketball</value> </key> <value>篮球</value> </entry> </map> </property>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjszd.html