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的模板类
操作数据库更简洁
创建和管理项目中对象的
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的模板类
操作数据库更简洁
相关文章推荐
- Spring学习(1):控制反转(IoC)和依赖注入(DI)的详解以及注解(annotation)开发入门案例
- 框架 day36 Spring3 入门,DI依赖注入,装配bean基于xml/注解, 整合Junit4,配置约束自动提示
- Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解
- JavaWeb Spring开发入门深入学习
- Spring AOP注解通过@Autowired,@Resource(J2EE提供),@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解
- Web框架梳理:第五章:SpringMVC、SpringMVC注解开发、SSM:整合
- Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解
- Spring入门学习初体验(2)----基于注解的AOP
- 利用Spring的AOP编程和JAVA自定义注解,实现Web项目的HTTP请求头域检测
- Web框架梳理:第三章:Mybatis入门、Mybatis代理开发、log4j:日志管理工具
- Spring(十二)AspectJ框架开发AOP(基于注解)
- Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解
- Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解
- spring学习(五)—通过注解方式创建对象和注入属性
- Spring学习笔记四(AOP中的通知参数和注解开发)
- Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解
- 注解开发spring-aop 入门
- Spring3.0 学习-AOP面向切面编程_Spring AOP的注解模式即Aspectj模式
- JavaWeb开发基于Spring和mybatis框架(学习日志)
- Spring学习-21:Spring的AOP:基于AspectJ的注解开发