IOC操作Bean

xml配置文件

  • id属性:唯一标识
  • class属性:l类全路径
  • 默认执行无参数构造方法完成对象创建

    基于xml方式注入属性

    DI 依赖注入 就是注入属性

  • set 方法注入

    • 标签中使用property
      • name 类中属性名称
      • value 向属性中注入的值
  • 有参构造方法注入
    • 标签中使用constructor-arg
      • name
      • value
  • p名称空间注入
    • 引入p属性
    • p:bname
    • p:bauthor
  • xml方式注入其他类型属性

    • 字面量

      IOC操作Bean管理(FactoryBean)

  • 两种类型bean

    • 普通bean 返回类型=配置文件中定义的bean类型
    • 工厂bean FactoryBean 可以不一样
  • 工厂bean
    • 实现接口FactoryBean
    • 方法中定义返回类型
  • bean的作用域
    • 单实例 默认
    • 多实例
    • 可以通过bean标签中的scope属性设置
      • 默认值 singleton 单实例对象 加载配置文件时就创建
      • prototype 多实例对象 getBean()时才进行创建
      • request
      • session
  • bean的生命周期

    • 构造器创建bean实例(无参数构造)
    • 为备案属性设置值,调用set方法
    • (将bean实例传递给后置处理器)
    • bean的初始化方法,需要配置
    • (将bean实例传递给后置处理器)
    • bean的使用
    • bean的销毁的方法,需要配置
    • (加上bean的后置处理器)

      自动装配

  • 根据制定装配规则(属性名称或者属性类型),spring可以自动将匹配的属性值进行注入

  • autowire=
    • byName 根据属性名称 id值=属性值
    • byType 根据属性类型

      外部属性文件

      1. <!--引入外部属性文件-->
      2. <contextproperty-placeholder location="classpath:jdbc.properties">

基于注解方式操作bean

注解

  • 代码特殊标记
  • @注解名称(属性名称=属性值)

    spring针对bean管理中提供的注解

    1. @Component
    2. @Service
    3. @Controller
    4. @Repository

    基于注解方式实现对象创建

  • 开启组件扫描

  • 添加注解

    组件扫描配置

    1. use-defalut-filters="false" 需要自己配置filter
    2. <context:include-filter type='' expression=''>

    基于注解方式实现属性注入

    ```java @AutoWired 根据属性类型进行自动装配 对象类型 byType @AutoWired private UserDap userDao; @Qualifier 根据属性名称进行注入 搭配@AutoWired byName

@Resource 根据类型或者名称

@Value 注入普通类型属性

@Value(value=”abv”) //等价property private String name;

  1. <a name="FfiTJ"></a>
  2. #### 完全注解开发
  3. - 创建配置类,替代xml配置文件
  4. ```java
  5. @Configuration//配置类
  6. @ComponentScan(basePackages)
  7. // 加载配置类
  8. ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class)

AOP

基础概念

  • 面向切面编程,降低耦合度

    底层原理

    有接口时,使用JDK动态代理

    创建接口实现类的代理对象

    jdk动态代理

  • 使用proxy类里的方法创建代理对象

  • newProxyInstance(ClassLoader loader,类<?> interfaces,InvocationHandler h)

    • 类加载器
    • 类实现的接口
    • 增加的配置逻辑

      编写动态代理

  • 创建代理对象代码

    • 实现InvocationHandler接口
    • 有参构造传递对象
    • 增强逻辑
    • 原方法实现
      • menthod.invoke(obj,args)
    • 调用proxy.newProxyInstance

3.

没有接口时,使用CGLIB动态代理

1.创建当前类子类的代理对象

术语

连接点

  • 类中可以被增强的方法

    切入点

  • 实际被增强的方法

    通知(增强)

  • 实际增强的逻辑部分

  • 多种类型

    • 前置通知
    • 后置通知
    • 环绕通知
    • 异常通知
    • 最终通知 finally

      切面

  • 动作

  • 将通知应用到切入点的过程

    AOP操作

    spring框架一般都是基于AspectJ实现AOP

    AspectJ,独立AOP框架

    切入点表达式

  • 作用:知道对哪个类里面的哪个方法进行增强

  • 语法结构
    • execution(【权限修饰符】【返回类型】【类全路径】【方法名称】【参数列表】)
  • 对add方法进行增强
    • execution(*com.atguigu.dao.BookDao.add(..))
  • 对所有方法进行增强
    • execution( com.atguigu.dao.BookDao.(..))
  • 对所有类,所有方法进行增强

    • execution( com.atguigu.dao..*(..))

      进行通知的配置

  • 在spring配置文件中,开启注解扫描

  • 使用注解创建User和UserProxy对象
  • 在增强类上面添加注解@Aspect
  • 在spring配置文件中开启生成代理对象
    1. <aop:aspectj-autoproxy/>
    2. //配置不同类型的通知
    3. @Before(value="execution()")
    4. @After()最终通知
    5. @AfterReturning()后置通知
    6. @AfterThrowing()
    7. @Around()

    相同切入点获取

    ```xml @Pointcut(value=execution()) public void demo(){ }

@Before(value=”demo()”)

  1. <a name="bdPa0"></a>
  2. #### 有多个增强类对同一个方法进行增强,通过order注解改变优先级
  3. <a name="Y0hqe"></a>
  4. ### AspectJ配置文件
  5. ```xml
  6. <aop:config>
  7. 切入点
  8. <aop:pointcut id = "" expression="">
  9. 配置切面
  10. <aop:aspect ref="增强类">
  11. 作用在具体的方法上
  12. <aop:before method=""pointcut-ref=''>

完全注解开发

  • config配置文件

JdbcTemplate

概念

  • spring框架对JDBC进行封装,方便实现对数据库操作

    准备工作

  • bean.xml

    • 数据库连接池
    • JdbcTemplate对象
      • 注入datasource
    • 实体类

      具体实现

  • 添加删除修改功能

    • update(String sql,Object… args )
  • 查询功能

    • 查询返回某个值
      • queryForObject(String sql,Class requiredType)
    • 查询返回对象
      • queryForObject(String sql,RowMapper rowMapper,Object… args)
        • RowMapper是接口,返回不同数据类型,使用这个接口实现类完成数据封装。
    • 查询返回集合
      • query(String sql,RowMapper rowMapper,Object… args)
    • 批量添加删除修改功能
      • batchUpdate(String sql,List batchArgs)
        • List集合,添加多条记录数据

          事务

          概念

  • 事务:数据库操作的最基本单元,要么都成功,要么都失败

  • 四个特性ACID

    • 原子性 不可分割
    • 一致性 总量不变
    • 隔离性
    • 持久性

      事务操作

  • 经典转钱案例

    • 开启事务操作
    • 进行业务操作
    • 没有发生异常,提交事务
    • 出现异常,事务回滚
  • spring中进行事务操作管理(一般添加到service层)
    • 编程式事务管理
    • 声明式事务管理
  • 一般使用声明式事务管理
    • 基于注解方式
    • 基于xml配置文件方式
  • 底层使用AOP原理

Spring事务管理API

  • 提供一个接口,代表事务管理器,这个接口针对不同框架提供不同的实现类
    • PlatformTransactionManager
  • 基于注解方式声明式事务管理 ```java // 引入tx名称空间 // 开启事务注解

    @Transactional( propagation()事务传播行为 isolation()隔离级别 timeout()超时时间 readOnly()是否只读 rollbackFor()回滚 noRollBackFor()不回滚 )

```