1.Spring的核心构成
IOC Spring最核心的模块
DAO Spring对访问数据库的支持,主要是JDBC
MVC Spring对MVC设计模式的支持(SSM)
AOP (Aspect Orientied Programing)面向切面编程
ORM 对象关系映射 Spring 和ORM框架整合 Mybatis
2. IOC(Inversion of Controller)控制反转,容器提供对象;
3. Spring容器是用来管理Bean组件的,Spring容器实现了IOC 和AOP,Spring容器对应的类型ApplicationContext 和 BeanFactory;
4.Spring容器使用先导包(IOC和AOP)
5.Spring容器创建bean对象的三种方式
1. 使用构造方法来创建对象,默认使用无参
<bean id="对象id" class="包名+类名"></bean>
2. 使用静态工厂方法
<bean id="对象标示" class="工厂的包名+类名" factory-method=""静态工厂方法名></bean>
3.使用实例化工厂方法
<bean id="标示" class="目标对象的包名+类名" factory-bean="工厂对象的标识" factory-method="实例化工厂方法"></bean>
6. Spring 容器中bean对象的作用域 使用bean 标签中的scope 来指定
scope="singleton/prototype'
7.DI(Dependence Injection 依赖注入)解决组件的装配问题,DI是IOC的一种具体实现手段
8.DI的实现方式
1.setter 注入
<bean id="player" class="com.xdl.bean.Player">
<property name="name" value="shenge"/>
<property name="age" value="18"/>
</bean>
2.构造器注入
<bean id="player" class="com.xdl.bean.Player">
<constructor-arg index="0" value="chen"/>
<constructor-arg index="1" value="18"/>
</bean>
3.自动注入
<bean id="" class="" autowire="no/byName/byType/constructor/autodetect"></bean>
no 默认值 byName 根据属性的名字 byType 根据类型去查找
constructor 优先按照构造方法参数的名字去查找,如果找不到,
4. 组件扫描
4.1 作用:
Spring 提供了一套基于标注(注解)的配置方式,简化XML配置;
4.2
拷贝spring 容器对应的配置文件 并且在这个配置文件 中 开启组件扫描
<context:component-scan base-package="包名"> </context:componet-scan>4.3 组件的名字问题
默认是类名首字母小写 当然也可以指定加载到容器中的组件名
5.Oracle 数据库连接参数(db.properties)
driverClassName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:xe
username=system
password=123456
maxActive=30
dbcp连接(xml配置)
<!-- 使用 db.properties 文件构建一个集合 -->
<util:properties id="dbparam" location="classpath:db.properties"></util:properties>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
<property name="driverClassName" value="#{dbparam.driverClassName}"></property>
<property name="url" > <value>#{dbparam.url}</value></property>
<property name="username" value="#{dbparam.username}"></property>
<property name="password" value="#{dbparam.password}"></property>
</bean>
6.组件扫描
@PostConstruct 构造方法之后进行初始化
@PreDestroy 销毁之前指定销毁方法
@Scope 指定对象作用域
@Value 注入容器中的值(之前可以注入简单类型,现在对象类型也可以注入)
@Autowired 可以用在成员变量,set方法,构造方法上(参数个数要匹配),有限按照类型查找,如果找不到则按照名字查找,配合@Qualifier 可以直接指定名字进行查找,这样不能放在构造方法上;
@Resource 可以用在成员变量 set方法上,java 的基本标注
7.Spring DAO
data access object 数据访问对象,以面向对象的方式访问数据库,对JDBC做了封装和简化,提供了AOP模式的事物处理,把JDBC的异常处理进行封装,由原来的检查异常(必须处理)变成了一个 DataAccessException ,这个异常集成了RunTimeException;
Spring DAO 将最核心的封装交给了JdbcTemplate ,这个对象来负责加载驱动 连接获取 执行环境获取 资源释放等。使用JdbcTemplate 有两种方式,第一:继承JdbcDaoSupport类,第二:手动注入JdbcTemplate;
第一种方式:
@Resource
public void setMyDataSource(DataSource dataSource) {
// 传给父类
super.setDataSource(dataSource);
}
@Override
public int getBankAccountCount() {
// 使用父类中对应的模板 完成查询
return super.getJdbcTemplate().queryForInt("select count(*) from xdl_bank_account");
}
RowMapper对象
public class BankAccountMapper implements RowMapper<BankAccount> {@Override
public BankAccount mapRow(ResultSet rs, int arg1)
throws SQLException {
return new BankAccount(rs.getInt("id"),rs.getString("card_no"),
rs.getString("card_name"),rs.getString("card_password"),
rs.getDouble("card_money"));
}
}
8.事务 在进行一组dml语句操作 要求这组sql语句同时成功,或者同时失败
事务的四大特性:
原子性:事务中的语句是一个逻辑整体,必须同时成功,或者同时失败
一致性:数据一旦变化,提交之后 就不会轻易改变
持久性:跟一致性差不多
隔离性:解决数据库的三大读问题;
脏读:一个事务读取了另一个事务中没有提交的数据;(关系型数据库已经解决了脏读)
不可重复读: 一个事务在开始时 查询一个数据 在这个事务处理的过程中 另一个事务对这份数据做了修改,这样前后读到的数据就不同了;
幻读:不可重复读关注的是更改 幻读关注的时增删
隔离性对应四个隔离级别 读未提交 读提交 可重复读 序列化
9.AOP面向切面编程(切面---通知---切点)
1.可以通过配置形式将操作纳入到事务管理中,只缺钱只能硬编码来处理事务,现在可以用更加灵活的配置方式
2. 代码逻辑和事务控制 可以松耦合 要去掉事务控制代码 可以再配置文件中进行移除
开启事务:
<tx:annotation-driven transaction-manager="事务管理器" proxy-target-class=""/>
transaction-manager 事务管理器 需要我们在容器中自己定义
proxy-target-class 代理类是否优先使用 CGLB sun公司有jdk的代理 这里要求被代理类必须实现一个接口 true 代表有限使用CGLIB,在需要事务的方法上 加@Transactional