回答要点:
1、动态代理的作用
2、动态代理的特点
3、动态代理的分类
4、两种动态代理的使用要求
1、不改变原代码的情况下,增强方法
2、动态代理的特点,字节码随用随创建,随用随加载
3、4、基于接口的动态代理(JDK动态代理):由JDK官方提供
要求:被代理类最少实现一个接口
涉及类:Proxy
创建代理对象的方法:newProxyInstance
方法中的参数:
ClassLoader:类加载器。
负责加载代理对象的字节码。
和被代理对象使用相同的类加载器。固定写法。
Class[]:字节码数组。
负责让生成的代理对象具有和被代理对象相同的方法。写什么要看被代理对象是一个接口还是一个实现类。
如果是一个接口: new Class[]{接口字节码}
如果是一个实现类:XXX.getClass().getInterfaces();固定写法
InvocationHandler:一个接口,需要我们提供该接口的实现。
作用是用于对方法增强。
增强的代码,谁用谁写。写的是一个接口的实现类。
通常是一个匿名内部类,但是不绝对。
基于子类的动态代理(CGlib动态代理):由cglib第三方提供
要求:需要导入cglib的坐标。被代理类不能是最终类。(不能被final修饰)
涉及类:Enhancer
创建代理对象的方法:create
方法中的参数:
Class:字节码对象。
用于加载代理对象字节码的。
写的是被代理对象的字节码。是固定写法
Callback:如何代理。提供增强代码的。它是个接口,需要自己写实现。
该接口没有方法,需要用它的子接口MethodInterceptor
应用场景
1、基于aop思想的方法增强。
2、自定义连接池中,实现Connection的close方法还回池中操作
3、解决tomcat8.5以下全站中文乱码,get和post两种提交方式的。
在get方式需要对以下三个方法增强,用于解决乱码:
String value = getParameter(String name);
String[] value = getParameterValues(String name);
Map<String,String> map = getParameterMap();
{/collapse-item}
{collapse-item label="IOC和DI的关系" }
1、技术介绍
2、应用场景
IOC(控制反转)
全称为: Inverse of Control。从字面上理解就是控制反转了,将在自身对象中的一个内置对象的控制反转,反转后不再由自己本身的对象进行控制这个内置对象的创建,而是由第三方系统去控制这个内置对象的创建。简单来说就是把本来在类内部控制的对象,反转到类外部进行创建后注入,不再由类本身进行控制,这就是IOC的本质。
DI(依赖注入)
全称为Dependency Injection,意思是自身对象中的内置对象是通过注入的方式进行创建。
IOC和DI的关系
ioc就是容器,di就是注入这一行为,那么di 确实就是ioc的具体功能的实现。而ioc则是di 发挥的平台和空间。所以说,ioc和 di即是相辅相成的搭档。最重要的是,他们都是为了实现解耦而服务的。
DI是如何实现的?
依赖注入可以通过setter方法注入(设值注入)、构造器注入和接口注入三种方式来实现,Spring支持setter注入和构造器注入,通常使用构造器注入来注入必须的依赖关系,对于可选的依赖关系,则setter注入是更好的选择,setter注入需要类提供无参构造器或者无参的静态工厂方法来创建对象。
应用场景
例如:在生产实际中,一个类中会调用其他类的方法,一般情况(原始情况)下直接new创建类对象,但这种方法是需要开发人员自行维护二者的依赖关系,也就是说当依赖关系发生改变时需要修改代码并重新构建整个系统,这对公司业务而言是有损失的(重启需暂停服务,对用户而言难以接受)。这个时候就出现了IOC这一技术,如果通过一个容器来管理这些对象以及对象的依赖关系,则只需要在类A中定义好用于关联接口B的方法(接口B通过构造器或setter方法注入),将类A和接口B的实现类C放入容器中,通过对容器的配置来实现二者的关联。
{/collapse-item}
{collapse-item label="怎么对IOC容器的配置,管理IOC容器中的对象bean"}
通过 Spring 提供的 IOC容器可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度程序耦合。
一是通过xml配置文件的方式配置bean(使用标签
二是通过注解的方式配置bean(常用注解@Controller、@Service、@Repository、@Component)
@Autowired注解,可以实现自动装配
@Autowired
private BookService bookservice;//等同于bookservice = ioc.getbean(BookService.class)
依赖注入原理:
(1)先按类型找:
找到一个就赋值;
没找到就报错;
(2)找到多个按照属性名作为id名继续匹配–>找到就装配,找不到还是报错
Tips:
1)加@Qualifier表示用指定的变量名作为id名去找组件而非属性名了;
2)默认通过@Autowired注解实现自动装配是一定要找到的,所有情况下找不到就会报错;
3)@Autowired注解的required属性指定某个属性允许找不到还不报错
@Autowired(required = false)
private BookService bookservice;
4)如果对一个数组或集合类型标注自动装配,则自动匹配类型兼容的所有bean组件
5)@autowired和@resource都能实现自动装配,区别:
@autowired–只能在spring框架里用
@resource–j2ee的标准,扩展性更强
Spring之IOC容器创建bean对象的XML配置总结
{/collapse-item}
{collapse-item label="Git使用重点" }
Git版本控制,版本管理
git本地仓库 删除文件
git checkout . #本地所有修改的。没有的提交的,都返回到原来的状态
git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop恢复。
git reset --hard HASH #返回到某个节点,不保留修改。
git reset --soft HASH #返回到某个节点。保留修改
原文地址:http://www.pizida.com/git-rm.html
{/collapse-item}
{collapse-item label="EL与JSTL" }
学习EL与JSTL不然首先要创建JSP,在JSP中:
1、JSP指令 格式:<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
- page:contentType -> 等同于response.setContentType()
import -> 导包
errorPage -> 当前页面发生异常后跳转到指定页面
isErrorPage -> 标识当前页面是否是错误页面,默认为false。设置为true时,可以使用内置对象exception
- include:设置包含某页面
- taglib:导入资源
2、JSP内置对象 在JSP页面中不需要创建,直接使用的对象;一共有9个
- pageContext 当前页面共享数据,还可以获取其他八个内置对象
- request 一次请求访问的多个资源(转发)
- session 一次会话的多个请求间
- application 所有用户间共享数据
- response 响应对象
- page 当前页面(Servlet)的对象
- out 输出对象,数据输出到页面上
- config Servlet的配置对象
- exception 异常对象
3、EL
- EL运算符:empty应用于判断字符串、集合、数组对象是否为null并且长度是否为0
${empty list}
- 获取值 **el表达式只能从域对象中获取值** 语法:${域名称.键名} 从指定域中获取指定键的值
- 对象属性的获取,其实将对象的getter和setter方法去掉前面的get和set,
然后大写字母变小写获得的值就是就可以用EL表达式${对象.属性}即可获得属性值
4、JSTL
- JSP标准标签库; 用于简化和替换JSP页面上的java代码
- 首先需要导入jstl相关jar包
- 引入标签库:taglib指令 <%@ taglib uri="" %>
- 常用JSTL标签
1、if :相当于java中的if
2、choose :相当于java中的witch
3、foreach :相当于java中的for循环
{/collapse-item}
评论 (0)