1 SSM
1.1 Spring
1.1.1 IOC
Spring创建对象的两种方式:
- XML文件注册bean对象;
<bean id="student" class="com.zheng.pojo.Student"></bean>
- 注解实现。
步骤:
- 在类中添加注解;
- @Component(value=""):其中value属性等价于xml文件中bean的id,不写时默认是首字母小写的类名,将类注册进Spring容器中,具有同样作用的注解还有@Controller、@Service(业务层注解)、@Repository(DAO层注解);
- @Value(""):在括号内给基本类型属性赋值;
- @Autowired:给引用类型属性赋值;
- @Qualifier(value=""):对于存在多个实现类的接口属性,需要在value中指定要创建对象的类,即类名小写。
- 在xml文件中添加组件context扫描类;
<!-- 扫描com.zheng.pojo包小的所有类 -->
<context:component-scan base-package="com.zheng.pojo"/>
1.1.2 AOP
代理模式:
- 静态代理三类角色:真实角色和代理角色实现了共同的接口,其次代理要有真实角色的引用,代理角色可以附加自己的功能。
(1)真实角色:真正做事情的角色(栗子:房东);
(2)代理角色:暴露给外界的(栗子:中介);
(3)抽象角色:(栗子:租房) - 动态代理:可以代理多个真实角色
当不同的模块不存在关系(例如父子类关系),且有共同的方法需要实现,为了不重复写代码,此时需要使用AOP。
AOP注解:
- @Aspect:修饰类,表明这个类是个切面,即具有共同方法的类;
- @Before("execution()"):修饰方法,表示前置通知,在切点前执行;
- @After:修饰必须被执行的方法,表示后置通知,在切点后执行;
- @AfterReturning:修饰方法,表示返回通知;
- @AfterThrowing:修饰处理抛出异常的方法,表示异常通知;
- @Around:修饰方法,表示环绕通知;
- @order:当在同一个切点上定义多个切面的通知时,该注释用于定义通知执行的先后顺序,注:前置通知值越小越先执行,后置通知值越小越后面执行。
try{
@Before
//PointCut(切点方法)
@AfterReturning
} catch (Exception e){
@AfterThrowing
} finally{
@After
}
AOP的实现方式
- 通过注解写切面类和通知;
- 在xml文件中开启注解;
<
1.2 Spring MVC
1.3 Mybatis
实体类与数据库的表对应,实体类的属性与数据库表的字段对应,对象与表中的一行值对应。
Mybatis用法
- 编写实体类;
- 数据库中要有相对应的表;
- 操作数据库的SQL语句写到xxxmapper.xml;
- mybatis-config.xml核心配置文件,数据库链接所需要的驱动 url账号和密码;
- DAO层(处理事务)的编写。
Spring整合Mybatis
2 Java语言
2.1 反射(Reflection)
- 反射(Reflection)是动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
ClassLoader(类加载器)将class文件加载JVM中运行,overload(重载)在编译时确定,override(重写)在运行时确定。
通过反射动态创建实例的两种方法: - 使用Class对象的newInstance()方法来创建Class对象对应类的实例;
Class<?> c = String.class;
Object str = c.newInstance();
- 反射相关的主要API:
- java.lang.Class:Class类,描述了Class对象对应类的成员和方法信息;
- java.lang.reflect.Method:代表类的方法;
- java.lang.reflect.Field:代表类的成员变量;
- java.lang.reflect.Constructor:代表类的成员构造器;
- 反射使用:
- 获取Class类对象;
//方法一:使用Class类的forName()静态方法;
Class<?> c = Class.forName("包名+类名");
//方法二:使用运行时类的class属性
Class<?> c = String.class;
//方法三:使用运行时类的对象
String str = new String("SPDB");
Class<?> c = str.getClass();
//方法四:使用类加载器
ClassLoader classLoader = this.getClass().getClassLoader();
Class<?> c = classLoader.loadClass(str);
- 通过反射创建Class对象对应类的实例;
//方法一:使用Class类对象的newInstance()方法;
Class<?> c = String.class;
Object str = c.newInstance();
//方法二:使用对象
- 获取Class对象的属性和方法
- 反射的过程
- 程序中创建的类经过编译(javac.exe)后生成字节码文件(.class);
- java.exe(JVM类加载器)将***.class文件加载到内存后,成为运行时类,存在缓存区,此时运行时类就是Class的实例;
- 每个运行时类只加载一次;
- 通过Class的实例可以作如下操作:1)创建Class实例对应的运行时类的对象;2)获取和调用Class实例对应的运行时类的属性、方法以及构造方法。
- 类加载器
- bootstap ClassLoader: 引导类加载器,C++编写,JVM自带的类加载器,用来加载Java核心类库。
- Extension ClassLoader: 扩展类加载器,用来将jre、lib和ext目录下的jar包装入工作库;
- System ClassLoader: 将java classpath所有目录下的类包装入类库。
参考文档:深入理解Java反射
2.2 异常处理
问题:
- 异常是什么,怎么产生的,有什么影响?
- 有哪些异常?
- 怎么处理异常?
- Exception(运行时异常)
RuntimeException(运行时异常)可以不需要处理,一般指编程时的逻辑错误,仔细检查代码可以避免此类异常,该类的子类都是运行时异常,IOException(编译时异常)必须捕获处理。 - 自定义异常
用户自定义异常类一般是RuntimeException的子类,需要提供serialVersionUID.
异常处理机制:
- 抛出(Throw);
- try.....catch.....finally:1)try中执行可能产生异常的代码,catch负责捕获异常,除非在finally之前退出程序,否则finally中的语句一定会被执行;2)catch和finally语句是
- 手动抛出异常:1)首先要生成异常类对象,然后通过throw语句实现抛出操作;2)可以抛出的异常必须是Throwable或其子类的实例。
- 声明异常(throws):异常的处理方式,声明方法可能要抛出的各种异常类。
注: - 重写方法不能抛出比被重写方法范围更大的异常类型。在多态的情况下,对重写方法的调用-异常的捕获按父类声明的异常处理。
- Java程序执行过程中如果出现异常,会有JVM自动生成一个异常类对象。
参考文档:Java异常
2.3 注解
内置注解 - 作用在代码的注解
- @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误;
- @Deprecated - 标记过时方法,使用该方法时,会报编译警告;
- @SuppressWarnings - 指示编译器去忽略注解中声明的警告。
内置注解 - 作用在其他注解的注解
- @Target - 标记这个注解可以用来修饰哪些Java成员(如构造方法,普通方法,参数等);
- @Retention - 标记这个注解是保存在源文件(source)、字节码文件(class)还是运行时(runtime)中。
参考文档:注解
自定义注解
@Target
@Retentaion
public @interface MyAnnotation{
String name() default "";
}
3 相关技术
3.1 JSP
Web开发模式1:
view jsp(展示层,也用于控制页面跳转)
service 业务层
DAO JDBC(数据层)
Web开发模式2 MVC:
view jsp(展示层)
servlet SpringMVC(控制层,以前是Struts)
service 业务层
DAO Mybatis(数据层)
注1:上述模式层与层之间的依赖关系是单向依赖,即上层服务依赖下层,下层代码修改影响上层;
注2:为了解耦,写代码不要出现双向依赖,面向接口编程(接口隔离原则)。
4 设计模式
4.1 工厂模式
- 实现了创建者和调用者的分离。
- 详细分类:
- 工厂方法模式
- 抽象工厂模式
开闭原则:对扩展(新增代理类)开放,对修改(修改源代码)关闭。
依赖倒转原则
5 总结
设计模式
单例模式:
工厂模式:
观察者模式:
Java基础
引用放在栈区,对象放在堆区。
静态方法内可以使用this关键字(?)
--final
类实现接口的话要实现接口中的所有方法,继承抽象类不用。
Spring MVC
DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自己定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,是配置spring MVC的第一步。
ViewResolver:
jsp的四个作用域:page request session application;
Spring bean的作用域(scope):singleton(只创建一个对象)、prototype(每次都创建一个新对象)、request、session