什么是DI
Dependence Injection 依赖注入(依赖注射) 用来解决 组件值得 装配问题
Spring 容器如何完成注入
-
setter注入: 参考的是bean 对象 对应的类型中的set方法
<property name="参考set方法“ value=”简单值“></property> <property name="对象的引用" ref = "容器中的组件Id"></bean>
-
构造器注入
参考的是构造方法 将property 换成constructor-arg <bean id = "card" class="com.xdl.bean.Card" lazy-init="true"> <constructor-arg name="point" value="A"></constructor-arg> <constructor-arg name="suit" value="梅花"></constructor-arg> </bean> <bean id="player" class="com.xdl.bean.Player"> <constructor-arg index="0" value="10001"></constructor-arg> <constructor-arg index="1" value="高进"></constructor-arg> <constructor-arg index="2" value="1"></constructor-arg> <constructor-arg index="3" ref="card"></constructor-arg> </bean>
-
自动化注入
可以在bean标记中 加一个属性 autowire 通过指定值为byName 就是通过组件的Id 来进行自动注入 。 也可以设置byType 是按照组件的类型进行自动装配 还可以指定成constructor 是按照构造方法区匹配自动装配。
-
枚举类型 在配置文件中直接写值即可;
-
bean参数的注入
简单值得注入:
String类型、枚举、java基本类型、java基本类型对应的封装类(共18种类型) <property name ="参考set方法" value=" 值" /> <property name = " " ><value>值</value></property> 除基本类型 还可以赋值 null 值,使用<null /> 例:使用基本值的注入 , 构建连接池对象 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="oracle.jdbc.OracleDriver></property> <property name="url" value="jdbc:oracle:thin@localhost:1521:xe" ></property> <property name="username" value = "test" ></property> <property name="password"><value>test</value></property> </bean>
对象类型的参数注入:
<property name=" " ref="bean 组件的id" />
集合类型的注入:
List集合----- <list><value>值</value></list> set集合------<set><value>值</value></set> map集合------<map><entry key=" " value=" "></entry></map> Properies类型----<peops> <prop key="">值</prop> </props>
集合的单独定义:
如果要重复使用一个集合的数据,可以把集合单独定义一份,方法: 在复杂值注入的标签中加 util: ,并定义id,通过id引用; 如<util: list id=""> <value> </value></util:list> Properties 特殊 并且可以加载一个对应的 .properties 文件,如: <util:properties id = "dbparam" location="classpath:db.properties"></util:properties>
Spring 中的EL表达式:
Spring中的表达式是从容器中取值 ,取值的语法是把之前的$换成#
组件扫描
-
什么是组件扫描?
它是Spring 框架提供一套基于标注(注解)的技术,目的是为了简化XML文件的编写。
-
如何实现组件扫描
a:建立一个项目 导入jar包(IOC AOP) 并拷贝Spring 的配置文件到src下 b : 在Spring 配置文件中开启组件扫描 <context:component-scan base-package="包名“/> c : 编写一个Java类; 在这个类上打对应的标注(4个标注,对应4个层) @Repositor 持久层标注 (DAO,DAOImp) @Service 服务层标注(service) @Controller 控制层标注(controller、ajax等) @Component 通用层标注(bean) d : 创建Spring 容器 从容器中获取 对应的组件
标注
和IOC相关的(辅助性)标注:
@Scope ("Singleton | prototype") 控制作用域的标注
@PostConstructor 代表构造之后的初始化方法 相当于init-method属性
@PreDestory 对象销毁之前 相当于destory-method 属性
DI的标注
@value
可以用在成员变量 set方法上 用来解决简单值 的注入问题 用法是@value("值");
如果要赋值 复杂值 则需要使用EL表达式 用法是@value(value="#{对象Id}");
@AutoWired (默认要求被查找的组件必须存在,可通过required=false 来更改设定,找不到时不报错)
可以 用在 成员变量 set方法 构造方法上 解决复杂值的装配问题
优先按照类型进行查找,若找不到则启用名字查找;
@Qualifier 可以用来指定查找组件的名字,不再启用类型查找;但要和@AutoWired结合使用,且不能用于构造方法上
@Resource 属于JDK的标注 用在成员变量或者set方法上 优先按名字查找,找不到启用类型查找
注:@Resource从spring容器中获取实例注入到类的成员变量中
-
.Spring DAO 对JDBC的改进
简化了DAO实现类的编写 提供了高度的封装的API 提供了基于AOP的事务管理 它把JDBC中的检查异常 做了封装,封装成了一个DataAccessException这个异常继承RuntimeException
如何完成的改进
JDBCTemplate jdbc模板类 可以完成驱动加载 连接获取Sql执行环境构建 资源释放 JdbcDaoSupport 接口支持类 可以提供JdbcTemplate对象
-
采用继承JdbcDaoSupport 的方式来使用Spring DAO
步骤:1:建立一个项目 导入jar包(IOC aop jdbc 连接池 数据库驱动) 并拷贝配置文件到 src文件下 2:编写DAO接口 里面定义一个查询 某张表数据量的方法 3:编写DAO的实现类 继承JdbcDaoSupport (开启组件扫描、在类上加标注,在配置文件中 建立dataSource 并注入给JdbcDaoSupport) 从JdbcDaoSupport 获取模板对象 使用API 完成查询 supper.setDataSource(dataSource);//赋值给JdbcDaoSupport这个类 supper.getJdbcTemplate().queryForObject(sql, .class)//使用父类提供的模板进行查询 rowMapper 说的是结果集中的一行 转换成对象的过程对象 4: 从容器中获取DAO对象 测试
-
RowMapper 是什么?怎么用?
Spring中的RowMapper可以将数据中的每一行数据封装成用户自定义的类;常与JdbcTemplate一起使用 在数据库查询中,如果返回的是用户自定义类型的则需要包装,如果是java自定义的则不需要。 自定义类的包装实现: 通过建立内部类实现RowMapper接口,在内部类mapRow方法中实现; 例:public class UserMapper implements RowMapper{ public XdlUser mapRow (ResultSet rs , int i ) throws SQLException{ XdlUser user = new XdlUser(); //参数 rs 查询数据库返回的结果集 user.setUser_id(rs.getInt("user_id"); //参数 i user.setName(rs.getString("name")); return user; } }