您的位置:首页 > 编程语言 > Java开发

Web框架梳理:第四章:Spring学习入门、Spring属性注入、AOP编程、注解开发

2016-12-14 15:26 961 查看
1.Spring:
 
创建和管理项目中对象的

 1)IOC 
控制反转 Inverse of Controller 

   Spring中对象工厂(Spring容器):
 对象不能自己通过new
来创建,而是要通过Spring容器来创建,所以对象的创建的权利发生了反转,反转给容器创建. 
A类和B类对象都交给容器创建,在A类中定义一个B类的属性,可以通过属性的set方法给属性赋值.
  
容器默认是通过反射来创建bean对象的.调用构造方法.
 
DI:
依赖注入
   注入==给属性赋值
   a.set注入(*****):
      
调用set方法给属性赋值
      <property name="属性名"  ref="bean对象id值">
 <property name="属性名" value="值">
 
   b.构造方法注入(了解):
     
调用构造方法给属性赋值

  <constructor-argindex="0/1/2">
 
  c.自动注入(了解)
    byName

byType
 
 
注解开发(*****):
  
可以替换applicationContext.xml中bean的xml配置.
  
@Controller(value="id"):控制器的类(一般是Action上)
  @Service(value="id"):
一般用在业务逻辑类上 

  @Repository(value="id"):一般数据访问层类上
   @Component
   @autowire:按照类型的注入
   @Qualifier(id)
   @Resource: 直接按照名称自动注入的

    
 注意:启用注解扫描(包下注解
执行)
    <context:component-scanbase-package="com.zrkc.spring"></context:component-scan>

 
  
 
回顾:
反射  
编译期间不知道具体类 
加载类
   Class c1 Class.forName(全类名);
   Class c2 = DeptDaoHibernateImpl.class;
   Class c3= new DeptDaoHibernateImpl().getClass();
 
  Object obj=c2.newInstance();//创建DeptDaoHibernateImpl对象
 
 
框架底层  
测试用例:
    //输入类名 
创建这个类对象?

 Scanner sca = newScanner(System.in);

 String className =sca.next();         

 Class c =   Class.forName(className);
 Object obj=c.newInstance();//反射动态创建对象
 
 
Spring容器==对象工厂
action-----service/biz(业务逻辑)------dao
 dtd: struts2.3.dtd   xml内容 
顺序 
限制 要求
schema:dtd  xml内容 
顺序 
限制 要求

 2)AOP
          
Aspect OrientedProgramming(AOP),面向切面编程,是一个比较热门的话题。AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。比如我们最常见的就是日志记录了,举个例子,我们现在提供一个查询学生信息的服务,但是我们希望记录有谁进行了这个查询。如果按照传统的OOP的实现的话,那我们实现了一个查询学生信息的服务接口(StudentInfoService)和其实现
类 (StudentInfoServiceImpl.java),同时为了要进行记录的话,那我们在实现类(StudentInfoServiceImpl.java)中要添加其实现记录的过程。这样的话,假如我们要实现的服务有多个呢?那就要在每个实现的类都添加这些记录过程。这样做的话就会有点繁琐,而且每个实现类都与记录服务日志的行为紧耦合,违反了面向对象的规则。那么怎样才能把记录服务的行为与业务处理过程中分离出来呢?看起来好像就是查询学生的服务自己在进行,但却是背后日志记录对这些行为进行记录,并且查询学生的服务不知道存在这些记录过程,这就是我们要讨论AOP的目的所在。AOP的编程,好像就是把我们在某个方面的功能提出来与一批对象进行隔离,这样与一批对象之间降低了耦合性,可以就某个功能进行编程。

 3)SSH三大框架整合:分开来说。

AOP:
面向切面编程(**):
 
切面(aspect):一个具有公共的 通用功能的类对象
     
一般: 
事务管理   
日志管理 
权限检查  
安全处理   session验证   

 
目标对象(target):被切面 作用的对象 被横切的对象

UserServiceImpl  add   delete update

RoleServiceImpl   add  update findAll

DeptServiceImpl   add updatefindByID
 
  
 
切入点(pointcut):表达式(*****)
     
指定在目标对象中,   那些方法是需要被作用的一批方法.

 
连接点(JoinPoint):切入点中某个特定点(某个方法) 
 一批连接组织一起==切入点
 

  
 
通知(advise): 
切面功能作用的时机或者位置    
 前置通知:切面功能先执行 
然后执行目标对象方法的功能
 后置通知: 
先执行切入点的方法  
然后在执行切面对象方法
 环绕通知:先执行一部分切面的功能 
在执行目标对象的方法  
然后在执行切面另外功能 

 异常通知:执行切入点方法的出现异常的时候  

 最终通知:在finally执行切面的功能

 
   try{
     -- 
环绕通知前半部分
  --
前置通知
     //调用目标对象方法(UserServiceImpl)
 -- 
后置通知
 -- 
环绕通知后半部分
  
   }catch(Exception e){
     -- 
异常通知
   }finally{
     -- 
最终通知
   }
 
  
扩展:
 
创建对象几种方式:
    1) new 

   new  Date();
    2)反射  

    3)工厂对象方法   
封装了对象的具体创建细节

   Calendar cal =Calendar.getInstance(); 

    Date now = cal.getTime();
    4)静态工厂        方法

  Calendar cal =Calendar.getInstance(); 

1.Aop注解开发:
    @Aspect

@Pointcut

@Before

@Around

@AfterReturning

@AfterThrowing

@After
启用aop注解扫描:
   <aop:aspectj-autoproxyproxy-target-class="true"></aop:aspectj-autoproxy>

 
 
aop底层用来动态代理设计模式:
   UserServiceImpl: addUser()
      spring通过cglib.jar动态生成一个代理类

 

UserServiceImpl$1234 extends UserServiceImpl{

addUser(){
   --前置通知功能 
增强处理

  newUserServiceImpl().addUser();
   --后置通知功能 
增强处理

}

}

 

DeptServiceImpl$1234 extends DeptServiceImpl{

addUser(){
   --前置通知功能 
增强处理

  newDeptServiceImpl().addDept();
   --后置通知功能 
增强处理

}

}
2.三大框架(SSH)整合(*****):
   Struts2     2.3 表现层(视图view 
控制器StrutsPreparedAndExceuteFilter)
   Spring      3.1  管理bean对象的(整合其他的框架)

   Hibernate   3.3  
数据持久层(数据访问层)
   
  1)Spring整合Hibernate,为什么?
  a.dao或者mapper对象spring容器统一创建和管理
  b.第三方数据源连接池(Pool)    c3p0(****) dbcp
        
通过连接池获取连接 
快 反复利用
      c.采用aop思想 事务管理

 d.HibernateTemplate  
操作hibernate的模板类
    
操作数据库更简洁
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐