0.Spring核心
1)aop:面向切面编程,扩展功能不是修改源代码来实现
Aspect Oriented Programming
2)ioc:控制反转,将对象由new方式创建变成交给spring配置(注解)来创建
Inversion of Control
1.aop 概述 原理 操作
1.1概念、术语
1.2底层原理
1.3具体使用(aspectj实现)
2.Spring整合web项目
2.1什么叫整合
2.2实现原理
3. IOC用配置文件方式来创建对象
4. IOC用注解方式产生对象
4.1配置
4.2创建对象
4.3注入属性(注解)
4.4混合配置文件和注释
5.Spring事务管理
5.1配置文件实现
5.2注解方式实现
ioc底层原理(使用技术)
(1)xml配置文件(dom4j解析)
(2)工厂设计模式
(3)反射
AOP:面向切面编程,扩展功能不修改源代码来实现
采取横向的抽取机制,取代了传统纵向继承体系重复性代码
>>>Joinpoint(连接点):
类里面可以被增强的方法,这些方法称为连接点
>>>Pointcut(切入点):
所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.
实际被增强的方法就叫切入点
>>>Advice(通知/增强):
所谓通知是指拦截到Joinpoint之后所要做的事情就是通知(切面要完成的功能).
通知分为
>前置通知(在方法之前执行) @Before
>后置通知(在方法之后执行) @AfterReturning
>异常通知(方法出现异常) @AfterThrowing
>最终通知(在后置之后执行) @After
>环绕通知(在方法之前和之后执行) @Around
增强的功能就是通知/增强
>>>Aspect(切面):
是切入点和通知(引介)的结合
把增强应用到具体方法上面的过程称作切面
>>>Introduction(引介):
引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
>>>Target(目标对象):
代理的目标对象(要增强的类)
>>>Weaving(织入):
是把增强应用到目标的过程. 把advice 应用到 target的过程
>>Proxy(代理):
一个类被AOP织入增强后,就产生一个结果代理类
1)第一种情况,有接口情况,使用动态代理创建接口实现类(创建同级的接口实现类)代理对象
2)第二种情况,没有接口情况,使用动态代理创建类的子类(重写父类方法)代理对象
1.3.1 AOPXML配置实现
属性expression的常用表达式:
execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>) 访问修饰符是 public private ...
1)execution(* cn.itcast.aop.Book.add(..))
2)execution(* cn.itcast.aop.Book.*(..))
3)execution(* *.*(..))
4) 匹配所有save开头的方法 execution(* save*(..))
1.3.2 AOP注解实现
同IOC注释 先 开启扫描 AOP的注释
被增强的类(方法)
public class Book {
public void book() {
System.out.println("Book");
}
}
增强的类 value里面的值 还是上面(expression)讲过的execution的表达式
@Aspect
public class NewBook {
@Before(value="execution(* com.demo.Book.book())")
public void fun() {
System.out.println("NewBook!");
}
}
加载Spring核心配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
将加载配置文件和创建对象的过程,放到服务器启动的时候来完成
1)ServletContext对象
2)监听器
3)具体使用:
- 在服务器启动时候,为每个项目创建一个ServletContext对象
- 在ServletContext对象创建时候,使用监听器可以具体到ServletContext对象在什么时候创建
- 使用监听器监听到ServletContext对象创建时候,
-- 加载spring配置文件,把配置文件配置对象创建
-- 把创建出来的对象放到ServletContext域对象里面(setAttribute方法)
- 获取对象时候,到ServletContext域得到 (getAttribute方法)
java中的高内聚、低耦合:一个类中要紧密相连 、不同类的关联不能过于紧密
3.1spring的bean实例化的三种方式
>>>无参构造器(重点)
>>>静态工厂
public class BeanFactory {
//静态的方法来返回User对象
public static User getUser() {
return new User();
}
}
>>>实例工厂
public class BeanFactory {
public User getUser() {
return new User();
}
}
3.2Bean标签常用属性
>>>id:起名称,任意名称
>>>class:所要创建的对象的类的全路径
>>>name:功能和id属性一样,但name可以包含特殊符号(用在struts1)
>>>scope:-singleton:默认值,单例,多次创建还是同一个对象
-prototype::多例
-request:创建对象把对象放到request域里面
-session:创建对象把对象放到session域里面
-globalSession:创建对象把对象放到globalSession里面
3.3属性注入的三种方式(DI:依赖注入->向对象里面的属性设置值)
1)set(类也可以->ref)
对象注入:
2)有参数构造器
3)接口注入(Spring不支持)
3.4 P名称空间注入
xmlns:p="http://www.springframework.org/schema/p"
name是User类的属性
3.5复杂类型注入
>>>数组
>>>list集合
>>>map集合
>>>properties类型
11
22
33
22
33
44
com.mysql.jdbc.Driver
root
@Component("userDao")
public class UserDao {
public void fun() {
System.out.println("dao");
}
}
@Service("userService")
public class UserService {
private UserDao userDao;
public void fun() {
System.out.println("service()!");
userDao.add();
}
}
@Component("userDao") ====
Spring中提供@Component的三个衍生注解:
>>>@Controller:WEB层
>>>@Service:业务层
>>>@Repository:持久层
两种注入属性的方法:@Autowired / @Resource(name="")
属性注入 就不用set方法了 因为都是给属性赋值的操作
//在Service中注入Dao属性
@Autowired //根据类名(UserDao)来找对象的
private UserDao userDao;
@Resource(name="userDao") //根据name里面的对象名(@Component("userDao"))来找对象
private UserDao userDao1;
1)创建对象操作使用配置文件方式实现
2)注入属性的操作使用注解方式实现
@Resource(name="userDao")
private UserDao userDao;
不同dao层提供了不同的实现类 ,根据自己需求选择
在所要使用事务的类/方法上面加注解@Transactional