Spring学习第三话 -组件扫描及注解

Spring -03

1. 相关的标注 以及用法

1.1 组件扫描的其他标注

@Scope              控制对象作用域的  value属性的取值有  singleton  prototype 
@PostConstruct      控制对象初始化的标注 加在方法上
@PreDestroy         对象销毁对应的标注    注意必须是单例的  主动关闭容器

1.2组件扫描和DI相关的标注

配置文件优先
1.@Value
一般用于解决复杂值的注入 用法是@Value("值")
用在成员变量 ,set方法 
如果要1 复杂的值要结合SpringEL------ #{ ** }

2.@Autowired
一般用来解决复杂值的注入
可以用在成员变量 set方法 构造方法
优先使用类型进行匹配 如果类型有对应的多个对象 则启用名字匹配  
可以使用@Qualifier("组件的id") 这样就可以按照指定的名字进行匹配 但是这样对组件的
依赖属于强依赖   可以通过@Autowired 设置requried属性为false 解除强依赖

3.@Resource
一般用在 成员变量和set方法上
优先使用名字进行匹配 匹配不上会启用类型进行匹配
这个标注是JDK中的标注
可以通过@Resource 的 name 属性 指定加载的组件  @Resource(name="car")
 不能解除强依赖  
4.@Required 是检查一个组件是否赋值  用于setter方法(若没配置bean时会报错,可通过这个属性更改没配置bean也不报错)


5.@Inject 注解可以出现在三种类成员之前,表示该成员需要注入依赖项。按运行时的处理顺序这三种成员类型是:
(1)构造方法(2)SET方法(3)字段
@Inject注解的构造函数可以是无参或多个参数的构造函数。@Inject每个类中最多注解一个构造函数。

2. SpringDAO

 4.SpringDAO 的优势 
   对JDBC 进行了封装   简化了DAO 实现类的编写  
 Spring DAO 提供了基于AOP 的声明式事务 
 Spring DAO 对jdbc 中的异常做了封装,把异常封装成了 继承自RuntimeException 
     的 DataAccessException 
     
 SpringDAO中的核心类
 JdbcTemplate    可以自动加载驱动  获取连接  获取sql执行环境   资源释放 
		这个类的对应api可以完成增删改查
 JdbcDaoSupport   可以提供JdbcTemplate 类型的对象  
		提供模板对象时,这个类需要注入一个DataSource对象
 
利用继承JdbcDaoSupport 的方式 完成对一张表的数据量查询  
  6.1 建立一张表  xdl_bank_account_35
     id       int   pk
     acc_no   varchar(30)  uk
     acc_password  text
     acc_money  double 
     
         插入测试数据   提交 
      
  6.2 建立一个项目  导入jar包(ioc aop dao 数据库连接池  数据库驱动) 拷贝配置文件到src下
  6.3 编写一个DAO 接口    定义查询方法
  6.4 编写DAO 接口的实现类  继承JdbcDaoSupport  实现DAO 接口
  6.5 开启组件扫描   给DAO 的实现类的父类 注入DataSource()
   然后就可以使用父类获取模板对象  完成查询     在实现类上加对应的标注创建对象
  6.6 从容器中获取 DAO 实现类对应的对象  测试查询 
//  
    
  注意JdbcTemplate 无法直接把一个结果集转换成对象 
  需要借助RowMapper 接口     (把结果集转换成对象的过程封装起来)
  
  
  继承RowMapper------
结果集Spring自动rs.next()
如果表中的字段与实体类一一对应就可以使用Spring中自带的BeanPropertyRowMapper<T>(*.class)
不对应就用RowMapper() //

3. 如何使用继承JdbcDaoSupport完成对银行账户的增删改查

1.首先创建数据库表和相应的字段,并创建约束
2. 建立项目,导入jar包(ioc,aop,dao,数据库驱动,连接池)并且将applicationContext.xml文件放在src下
3. 开启组件扫描,并且配置数据源
4. 编写一个实体类(提供get set)方法,toString(),有参和无参以及序列化
5. 设置一个Dao接口根据银行账号完成增删改查
6. 实现Dao接口,继承jdbcDaoSupport,在实现类上加上对应的标注,给jdbcDaoSupport赋值dataSource
7. 测试结果

4. 不继承JdbcDaoSupport 完成对银行账户的增删改查

查询银行账户的数量
1.建立一个项目导入jar包(ioc aop dao 连接池 数据库驱动 ),拷贝容器对应的配置文件到src下
2.在配置文件中开启组件扫描
3.写一个DAO接口定义方法
4.在实现类定义一个JdbcTemplate的成员变量,在类上加@Repository标注
5在注入JdbcTemplate,JdbcTemplate创建时要使用到dataSource
6使用模板完成查询

5.声明式事务

5.1 编程式事务管理
5.2 声明式事务管理

声明式事务管理的优势

让业务组件 和 事务管理代码分离,逻辑更加清晰  组件的复用程度更高  提高了程序的灵活性

Spring 声明式事务的实现步骤

1 开启声明式事务 
    <tx:annotation-driven     transaction-manager="事务管理器的id" />
2 创建事务管理器
    <bean  id="事务管理器的id" class="..."></bean>
        这个组件依赖于dataSource
3 在需要事务管理的类上 或者方法上加 @Transactional
8.@Transactional 的属性 
  Spring 事务管理器 默认只针对运行时异常进行回滚     对检查异常不回滚
  可以通过 rollbackFor 属性可以指定对应的检查异常回滚。
  
  noRollbackFor    针对指定的运行时异常 不回滚 
  
  readOnly      只读   如果事务方法中所有的sql 语句都是select  则 
    readOnly 会对方法进行效率上的优化 。只要有DML 则改属性无效。
      
  isolation     隔离级别     事务的隔离级别有四个
          读未提交   读提交    可重复读    序列化 
    脏读: 一个事务读取到了另外一个事务没有提交的数据 
    不可重复读: 一个事务读取一份数据   另外一个事务修改了这份数据 并进行了提交 
        这个事务再次读取这份数据时 发现数据发生了改变。
    幻读:一个事务读取了整张表的数据   另外一个事务 增加了一些数据 并进行了提交 
          当第一个事务再次统计数据时 发现数据改变了。
          
  propagation       传播特性 
           一个方法调用一个事务方法时   事务应该如何表现
     REQUIRED    如果当前方法没有事务  则开启新事务,如果当前方法有事务 则加入到
                     当前事务之中。
 PROPAGATION_SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。

PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

PROPAGATION_REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。

PROPAGATION_NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常

PROPAGATION_NESTED 如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行   
NullPointerException   ClassNotFoundException  ArrayIndexOutOfBoundsException
IndexOutOfBoundsException  NumberFormatException  ArithmeticException
ClassCastException      

IOException、SQLException等以及用户自定义的Exception异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值