一, Spring简介
面向bean的编程
企业级整合框架, 粘合济, 提供一站式的企业开发
不重复制造轮子, 与第三方框架完美的整合
二,IOC(重点)
1, IOC -- 控制反转 -- 主要解决类与类之间的依赖问题, 降低耦合度, 提高扩展性
DI -- 依赖注入,
依赖由容器管理, 由容器创建bean对象, 在运行时把依赖注入
默认在容器初始化时, 就会创建bean, 分析解决bean与bean之间的依赖
控制反转: 程序本身不再负责依赖对象的创建, 而是把对象创建跟依赖的注入交给容器去完成
降低程序之间的耦合度
Bean的容器, 管理Bean的整个生命周期, 默认是单例的, 对于同一个bean, 多次从spring容器中获取对象, 获取都是同一个对象
2, 常用的注入类型
set值注入--通过setter 方法实现注入, 设为不强制性注入
为属性提供setter方法
通过 <propertyname="userDao" ref="userDao"/>配置属性
构建器注入 -- 通过构建器实现注入, 一定要注入, 要不程序会报异常
提供带参的构建方法, 同时注意保留无参的构建方法, spring容器初始化bean时要调用无参构建方法
<constructor-argname="userDao" ref="userDao"></constructor-arg>
工厂注入(spring不支持)
3, bean的作用域
singleton 单例, 默认
prototype 多例的, 对同一个bean, 每一次获取, spring容器都会new一个新的对象
只适应于WebApplicationContext环境:
request request, 每一次请求创建一个实例
session session
global session application范围
4, 创建机制
BeanFactory 接口: 工厂模式的实现, 负责bean的创建, 要求的资源不是很大, 适用于资源有限的环境
- <span style="font-family:SimSun;font-size:18px;">// 通过BeanFactory创建bean,具有延迟加载的作用,当用到的时候,再去创建
- Resource resource = new ClassPathResource("applicationContext.xml");
- BeanFactory beanFactory = new XmlBeanFactory(resource);
- UserService user3 = beanFactory.getBean("userService",
- UserService.class);
- System.out.println(user3.getId());
- System.out.println(user3.getName());
- user3.printTest();</span>
getBean() 从容器中取得bean的实例
getTypes()
containsBean()
ApplicationContext 接口, 是BeanFactory的一个子接口, web程序一般就使用这个接口的实现类:
ClassPathXMLApplicationContext
<span style="white-space:pre"> </span>ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
IUserService service = (IUserService) context.getBean("userService");
System.out.println(service.checklogin("admin","123").getUsername());
n(service.checklogin("admin","123").getUsername());
FileSystemXMLApplicationContext
- ApplicationContext ctx2=new FileSystemXmlApplicationContext("spring.xml");
- UserService user2=ctx2.getBean("userService", UserService.class);
- System.out.println(user2.getId());
- System.out.println(user2.getName());
三, AOP--面向方面编程--核心: 动态代理模式
会使用spring提供的现有的功能,比如:配置性事务管理
1, 本质: 通过动态代理, 动态往程序中方法的前后添加一些功能(代码)
动态代理: JDK--实现类必须实现接口
CGLIB -- 二进制包实现动态代理
重点在以下图上:
2, 第一个例子
增强设计:
//把切面设计为一个一个的增强
<pre name="code" class="java">public classUserAdvice {
private Logger logger =Logger.getLogger(UserAdvice.class);
public void beforeService(JoinPoint joinpoint){
System.out.println("前置增强执行了");
}
}
aop配置:
<aop:config>
<!-- 定义切入点, 帮我找到要增强的方法列表joinpints集合
* com.chinasofti.service.*.*(..) 找到com.chinasofti.service下所有类所有方法
-->
<aop:pointcutexpression="execution(* com.chinasofti.service.*.*(..))"id="userPointCut"/>
<!-- 把 userAdvice定义为一个切面-->
<aop:aspectref="userAdvice">
<aop:beforemethod="beforeService" pointcut-ref="userPointCut"/>
</aop:aspect>
</aop:config>