[Java] Spring 学习笔记
用面向对象的思维考虑问题 : 第一步【先考虑实体类】
1, 设计东西 :需要先考虑实体类。
JUDE 一个 类似 UML 的工具。
2, 设计 :图
UserDAO : 负责和不同的数据库打交道。等价于它直接屏蔽了数据库。(是interface)
UserService : 用户管理服务层。 其中有 private UserDAO userDAO; 成员变量
对外公开的是业务逻辑,以后比如认证,权限...。
UserDAOImpl implements UserDAO
UserDAOImpl 可以分为 MysqlImpl, OracleImpl, ... 面向抽象编程(好处灵活)
装修房子用壁纸 : 用符合国家生产规格的壁纸。 (尚学堂, 夏学堂生产的)
马士兵 :10 年买起房子.
3, 各种 DAO, DAO 太多, TeacherDAO, ..., 将其写到配置文件中去。
4, Spring , xml配置文件 项目驱动是最快的学习方式。
(1), jdom学习 :读取 xml 文件. google 搜索 例子 :class Sample1.
dom4j 比 jdom 要强大一些。
以前马老师用的 JUnit, 这块你不要害怕,藐视它就可以,有它的视频。
5, spring 的核心,在于自动装配。
可以在配置文件中,将很多类的关系设计好。
beans.xml
<beans>
<bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl"/>
<bean id="userService" class="com.bjsxt.service.UserService">
<property name="userDAO" bean="u"/>
<!-- 代表 userService 中有一个 setUserDAO 的方法,也就间接代表 其中有一个 userDAO 成员变量,其值初始化为 id 为 u 的 class。-->
</bean>
</beans>
一个类 UserService 里面 一个属性,可以给你指定好。在它生成的时候,就可以指定。
就看你配置文件怎么写。
6, 什么是 IOC (DI), 有什么好处?
(1), 把自己 new 的东西改为容器提供
(a), 初始化具体值
(b), 装配
(2), 好处, 灵活配置
7, Spring 的两大核心 : (1) IOC (2) AOP
8, Spring 介绍 。 读 Spring API
问 :spring3.1 这个 spring.jar 怎么不在 dist 文件夹里,是不是还要额外下载jar包?
答 :spring3.0以上已经没有提供完整的spring包了,按功能模块被分解成了,实际开发时,选择你需要的包即可,core,beans,context,
在使用web开发中一般都需要被加入,如果你实际应用使用了aop等,这些包也要被加入。
9, // dependency injection - 依赖注入 示例程序中, UserService, DAO 都依赖于 容器的 注入
/* inversion of control 什么是控制反转?
(1), Service 成员 userDAO 控制在容器手里了,不用自己new实现。反转到容器那里去了!
(2), 原来编程控制的是实现,现在是接口,是抽象, 反转到抽象
(3), 你控制的是接口,而不是整个实现了!原来控制在自己手里,现在控制在别人的容器手里了。 “控制反转”
*/
@(1), 指定 XML, catalog 书写规范与提示 Spring_09 自动提示 马士兵.avi
注入类型
Spring_0300_IOC_Injection_Type
setter(重要)
构造方法(可以忘记)
接口注入(可以忘记)
@(2), 以上讲解的都是 setter 注入
11, annotation
@(1), 普通 java 文件 中 @overvide 编译期间
Annotation-based container configuration
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/>
</beans>
---------------------------------------------------------------------------------------
(The implicitly registered post-processors include
AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor,
PersistenceAnnotationBeanPostProcessor, RequiredAnnotationBeanPostProcessor.)
----------------------------------------------------------------------------------------
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 这个文件相当于当前 xml 文件的命名空间
xmlns = xml namespace xmlns:context="http://www.springframework.org/schema/context" 命名空间
代表这个xml文件,以context开头的对应的东西到哪里找。
对应的能够写的内容context="http://www.springframework.org/schema/context" 到哪里去找
@2, xsd 文件 是元数据, 一般称之为 xml 的语法。
12, JSR-250
JCP (google网址) 指定 java 的新标准
annotation 开发效率高
13, AOP
@1, 慎用继承 (因为继承直接就写死了!)
经常组合代替了继承,组合灵活性更高!
@2, Spring 解决了单例的问题
动态代理 jdk 如果想产生动态代理,那么这个类就需要实现一个接口,没有implements接口的类,JDK是给它产生不了动态代理的。
jdk proxy invocationhander
14,
UserDAO userDAO = new UserDAOImpl();
LogInterceptor li = new LogInterceptor();
li.setTarget(userDAO);
UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), li);
(1), 产生的代理对象的 classLoader 和 被代理对象的 classLoader 要一样,因为代理对象中有一个 被代理对象,所以需要互相访问。
(2), userDAO.getClass().getInterfaces() 代理类(对象) 要实现这个接口。
(3), 第三个参数,代理用哪一个 Handler 进行处理。
(4), 因为代理类实现了 UserDAO 接口,抽象主题,所以进行强制转换。(UserDAO)
System.out.println(userDAOProxy.getClass());
userDAOProxy.delete();
userDAOProxy.save(new User());
写程序推荐,面向接口编程。
15, <aop:aspectj-autoproxy />
把逻辑织入到原来那个方法里面去。
@Aspect 说明这是一个切面类
@Component 初始化这个类
public class LogInterceptor {
@Pointcut("execution(public * com.bjsxt.service..*.add(..))") 指定这个切面点
public void myMethod(){};
@Before("myMethod()") 加在前面
public void before() {
System.out.println("method before");
}
@Around("myMethod()") 前后都加
public void aroundMethod(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("method around start");
pjp.proceed();
System.out.println("method around end");
}
什么是AOP
1, 面向切面编程Aspect-Oriented-Programming
a), 是对面向对象的思维方式的有力补充
2, Spring_1400_AOP_Introduction
3, 好处:可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码
a), Filter
b), Struts2的interceptor
4, 概念:
a), JoinPoint 释意: 切面与原方法交接点 即 切入点
b), PointCut 释意: 切入点集合
c), Aspect(切面)释意:可理解为代理类前说明 【是切面】
d), Advice 释意:可理解为代理方法前说明 例如@Before [切入到那个点上的逻辑]
e), Target 释意:被代理对象 被织入对象
f), Weave 释意:织入
** 写程序的业务逻辑不要依赖某种先后顺序。
一个类如果没有实现接口,那么我们就用抛出二进制码的形式实现代理,CGLIB。实现接口了的,就用JDK proxy实现代理。
Annotation 实现 AOP 不是很重要的内容,留下印象。
Spring AOP配置与应用
1, 两种方式:
a), 使用Annotation
b), 使用xml
2, Annotation
a), 加上对应的xsd文件spring-aop.xsd
b), beans.xml <aop:aspectj-autoproxy />
c), 此时就可以解析对应的Annotation了
d), 建立我们的拦截类
e), 用@Aspect注解这个类
f), 建立处理方法
g), 用@Before来注解方法
h), 写明白切入点(execution …….)
i), 让spring对我们的拦截器类进行管理@Component
IOC 和 AOP 是 Spring 的两大核心概念
声明式的事务管理 , dataSource 是提供标准化连接的方式。
在 Spring 中指定 dataSource, dataSource就是标准化取得连接的方式。