Spring -02
1.什么是DI
Dependence Injection 依赖注入(依赖注射)
一个组件 需要另外一个组件时 把组件的值设置给这个组件的过程叫做依赖注入
解决的是组件之间的装配问题
2. 完成DI的三种方式
1.setter注入
参考对象类型中定义的set方法
<bean id=" " class="">
<property name="去set方法之后首字母小写 " value=" 值" />
</bean>
优点: 灵活。可以选择性地注入需要的对象。
缺点: 依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用。
2.构造器注入
参考构造方法的参数
把上面的property 换成constructor-arg
其实构造器注入 还支持把name 换成index index 代表参数的位置 编号从0开始
优点: 对象初始化完成后便可获得可使用的对象。
缺点: 当需要注入的对象很多时,构造器参数列表将会很长;
不够灵活。若有多种注入方式,每种方式只需注入指定几个依赖,那么 就需要提供多个重载的构造函数,麻烦。
3.自动化注入
再定义一个bean时 可以通过bean标记的 autowire 指定对应的加载方式
让bean自动查找对应的组件进行装配。一般用来解决复杂值的注入。
autowire 的取值方式有
byName 安装属性名进行装配
byType 按照属性的类型进行匹配
constructor 按照构造方法的参数进行匹配 如果第一个参数不匹配 则终止后续赋值
4、接口注入
依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参数就是要注入的对象。
优点: 接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数 是要注入的对象类型即可。
缺点: 侵入性太强,不建议使用。
PS:什么是侵入性?
如果类A要使用别人提供的一个功能,若为了使用这功能,需要在自己的类中增加额外的代码,这就是侵入性
3. 如何创建DataSource 对象 并注入对应参数 的值
<!-- 配置连接池对象 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mysql"></property>
<property name="username" value="root"></property>
<property name="password" >
<value>123456</value>
</property>
</bean>
4. 如何注入java的集合参数
5.1 简单值的注入
八种基本类型 和 对应的封装类 String 枚举
使用value 赋值 即可
5.2 复杂值的注入
把value 换成 ref
5.3 集合参数的注入
把java 中的集合通过配置文件形式给一个对象 注入
List Set Map Properties
<property name="friends">
<list>
<value>小杰</value>
<value>小马</value>
<value>小泽</value>
<value>小泽</value>
</list>
</property>
--------------set-------------
<property name="friends">
<set>
<value></value>
</set>
</property>
-------------map------------
<property name="friends">
<map>
<entry key="" value="" />
</map>
</property>
-----------Properties-------------
Properties 的注入
<property name="friends">
<props>
<prop key="">阿吉</prop>
</props>
</property>
7.集合参数的单独定义
把一个集合对象 抽取出来 单独进行定义 然后被其它对象引用即可
------<单独定义一个list>-----
<util:list id="ref_friend">
<value>小杰</value>
<value>小马</value>
<value>小泽</value>
<value>小泽</value>
</util:list>
<property name="friends" ref="ref_friend">
-----------set----------
<util:set id="ref_friend">
<value>小泽</value>
</util:set>
<property name="friends" ref="ref_friend">
----------map------------
<util:map id="ref_friend">
<entry key="" value="" />
</util:map>
<property name="friends" ref="ref_friend">
--------Properties---------
<util:Properties id="ref_friend">
<prop key="">阿吉</prop>
</util:Properties>
<property name="friends" ref="ref_friend">
5. 什么是组件扫描 组件扫描的实现步骤
组件扫描叫 Component Scan 它是Spring 提供的一套基于注解(标注)
目的是为了简化XML 的配置。
解决自定义类
a.建立一个项目 导入jar包(ioc aop) 拷贝配置文件到src下
b.开启组件扫描
<context:component-scan base-package="包" />
c.编写一个java 类 编写对应的成员变量 和 方法 ....
d.在类上加对应的标注
@Component 通用层标注 -----工具类、用户类
@Service 服务层标注 ---- service类
@Repository 持久层标注 ---- dao
@Controller 控制层标注 ---- servlet/controller
e.创建Spring 容器 从容器中获取bean 进行测试