Spring
http://note.youdao.com/noteshare?id=6a10af129478cabe1611aee009c202a8&sub=03868FAC3AC4482AB7142A316F27356E
<a href="地址"></a>
Spring

一、概念
1.是什么
(1)spring 是开源轻量级框架
(2)核心: AOP:面向切面编程,扩展功能不是修改源代码实现
IOC:控制反转, Ioc是把对象的创建不是通过new方法实现而是交给sping配置实现创建对象
(3)一站式框架
spring在javaee三层结构中每层都提供不同的解决技术
Web层: springMVC
Service层: Spring 的IOC
Dao层:Spring的jdbcTemplate
2.为什么用Spring
- 
替代更加重量级的的企业级Java技术 
- 
简化Java的开发 
- 
Spring是一种非侵入式的框架 (对现有的类结构没有影响,就能够增强JavaBean的功能) 
- 
松耦合 
二、IOC
1.概念:
IOC控制反转 :(通过反射实现管理bean的容器)
Spring的核心思想之一:Inversion of Control , 控制反转 IOC。对象的创建交给外部容器完成,这个就做控制反转。
- Spring使用控制反转来实现对象不用在程序中写死
- 控制反转解决对象处理问题【把对象交给别人创建】
那么对象的对象之间的依赖关系Spring是怎么做的呢??依赖注入
- Spring使用依赖注入来实现对象之间的依赖关系
- 在创建完对象之后,对象的关系处理就是依赖注入
DI:依赖注入
向类中属性设置值。
关系:依赖注入不能单独存在,要在IOC基础上才能完成,即只有创建了对象才能注入属性。
2.作用:
不用自己组装,拿来就用。
享受单例的好处,效率高,不浪费空间。
便于单元测试,方便切换mock组件。
便于进行AOP操作,对于使用者是透明的。
统一配置,便于修改。
3.IOC的使用:
ioc底层原理
ioc的bean管理:(a)xml方式 (bean 实例)
(b)注解方式
(1)IOC底层原理:
XML配置+工厂模式+DOM4J解析+反射机制

反射机制:(不用new 的方式创建对象) (反射用到 :IOC和JDBC连接池)
。class 转化为。java
(1)在实体类User是无参构造时:创建对象方式
		Class<?> forName = Class.forName("com.test.entity.User.java");
		Object user= forName.newInstance();
(2)实体类User有参构造时:
Class<?> forName = Class.forName("com.test.entity.User.java");
		Constructor<?> constructor = forName.getConstructor(String.class,String.class );
		Object user = constructor.newInstance();
(补充问题:
private 属性绝对安全吗?
不安全,因为可以通过反射机制对私有属性赋值
)
(2)ioc的bean管理(1.xml方式):
a.bean实例化三种方式
           (1)使用类的无参数构造创建 (主要用法)
条件:实体类有无参构造,
配置中写法: 例如 <bean id="xxx" class=" xxx路径"/>
(2)使用静态工厂 (创建静态方法,返回对象)
注意配置写法
(3)使用实例工厂(创建不是静态方法,返回类对象)
注意配置写法
b.bean标签常用属性
(1)id 属性 : 根据id值得到配置对象
(2)class属性 : 创建类的全路径
(3)name属性 :功能和ID一样
(4)scope属性 :bean的作用范围 ( Singleton:默认值,单例对象 、Prototype:多例对象 )
c.属性注入:
spring使用中两种方式:
(1)set方式
1.实体类中set: class User{ public void setUsername(String username){this,username=username} 。。。。 }
2.配置中设置property :<bean id="user" class="xxx"> <property name="username" value="哈哈"/ > </bean>
(2)有参构造:
1.实体类中有参构造: class User{ public User (String username){this,username=username} 。。。。 }
2.配置中设置constructor-arg:<bean id="user" class="xxx"> <constructor-arg name="username" value="哈哈" > </bean>
(注意:注入复杂属性的写法,list、map、properties等)
(3)ioc的bean管理(2.注解方式):
a.bean配置中添加:注解扫描

b.取代<bean...../>的配置,类中用注解 @component(value=“user”) 完成,下面四个相同意义的注解
c.创建对象的四个注解:功能一样,在类上写
(1)@component web层
(2)@controller web层
(3)@service 业务层
(4)@Reponsitory 持久层
(@scope(value="Prototype") 多实例注解方式)
d.注入属性的两个注解: 在方法上写,取代set
(1)@Autowired
(2)@Resource 使用:@Resource (name="xxxx")
(4)测试类参考的写法: dao service action
 
三、AOP
1.概述
(1)特点:
1.面向切面编程
2.采用横向抽取机制,取代了传统纵向继承体系重复性代码
3.底层使用:jdk动态代理方式实现
(2)AOP的理念
:就是将分散在各个业务逻辑代码中相同的代码通过横向切割的方式抽取到一个独立的模块中!
AOP编程可以简单理解成:在执行某些代码前,执行另外的代码
- Struts2的拦截器也是面向切面编程【在执行Action业务方法之前执行拦截器】
实际运用:
(aop是一种思想,把与业务无关的代码都抽象出形成一个代码块)
日志管理
性能统计
安全控制
事务处理
异常处理
(3)底层原理:动态代理
动态代理分为 jdk动态代理和cglib动态代理
jdk动态代理(针对有接口的方式):创建接口类,接口实现类
cglib动态代理(针对没有接口的方式):创建实体类的子类的代理对象,子类中调用父类方法增强
(4)AOP术语
a.切入点

b.增强


c.切面

2.spring使用AOP:aspectj框架实现
aspectj实现aop的两种方式:基于aspectj的配置文件方式、基于aspectj的注解方式
(1)基于aspectj的配置文件方式:
a.配置中引入约束文件
b.配置文件中表达式:execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
例如三种写法:
c.配置写法:

(2)基于aspectj的注解方式:
a.开启扫描配置

b 在类中注解方式
book.add() 、mybook.before1()、test中调用add()

四、事务
(https://www.bilibili.com/video/av35914008/?p=17)
1.事务特性
- Spring的事务控制是属于Spring Dao模块的。
。。。
第一种:编程式管理(基本不用)
第二种:声明式管理
(1)基本xml配置
(2)基于注解实现
2.基于注解实现:
a.配置文件中添加:
<!-- 注解方式配置事务 -->
      <!-- 1.配置事务管理器 -->
      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <!-- 注入事务 -->
           <property name="dataSource" ref="dataSource"></property>             
      </bean>
      
       <!-- 2.配置事务注解 -->
        <tx:annotation-driven transaction-manager="transactionManager"/>
      
b.调用方法的类上注解 @Transactional
3.注意:
使用事务不能用 try 捕获异常,程序会以为把异常处理掉,事务原理就是AOP,aop环绕通知获取不到异常就不会有回滚动作。
4.隔离机制:四种状态。。。
5.事务传播行为: (控制那些用事务机制,那些可以不用事务,相当于设置一个事务开关)
(https://www.bilibili.com/video/av35914008/?p=20)

 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号