文章目录
@Resource和@Autowired
一、共同点
- @Resource和@Autowired都可以注解在字段和setter方法上。若注解在字段上则不需要再注解在setter方法上。
二、不同点
- @Resource不是Spring的注解,它在javax.annotation.Resource下;@Autowired是Spring提供的注解,在org.springframework.beans.factory.annotation.Autowired下。
- @Autowired是按照类型(byType)装配依赖对象,默认情况下它要求依赖依赖对象必须存在,如果设置它的required属性为false则允许null值。如果想按照名称(byName)装配,可以结合@Qualifier注解一起使用。
- @Resource默认按照名称(byName)装配依赖对象,由J2EE提供,它有name和type两个重要的属性;Spring将name属性解析为bean的名称,将type属性解析为bean的类型。所以如果使用name属性则使用byName自动注入策略,如果使用type属性则使用byType自动注入策略;如果既不指定name也不指定type,则将通过反射机制使用byName自动注入策略。
三、@Resource装配顺序
- 如果同时制定了name和type,则Spring从上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
- 如果只指定了name,则从上下文中匹配的bean进行装配,找不到则抛出异常。
- 如果只指定了type,则从上下文中找到类似匹配的bean进行装配,找不到或者找到多个都会抛出异常。
- 如果既没有指定name又没有指定type,则自动按照byName方式进行装配;如果没有匹配则按照byType的方式进行装配。
@Contorller和@RestController
一、异同点
- @RestController注解相当于@Controller + @ResponseBody组合在一起的作用。
- 如果只是使用@RestController注解controller,则controller无法返回jsp或html页面,返回的内容就是return里面的内容。
- 如果需要返回到指定页面,则需要用@Controller配合视图解析器InternalResourceViewResolver。
- @Controller注解如果需要返回Json、XML或者自定义的MediaType内容到页面,则需要在对应的方法上加上@ResponseBody,或者直接用@RestController。
DOM对象、JavaScript对象和jQuery对象
一、DOM对象
DOM对象: 文档对象模型(Document Object Model), 是W3C组织推荐的处理可扩展标志语言的标准编程接口。
- DOM对象实际上以面向对象的方式描述的文档模型。DOM定义了表示和修改文档所需的对象、对象的行为和属性以及这些对象的关系。
- 通过DOM,可以访问所有的HTML元素,连同它们所包含的文本和属性。可以对其中的内容进行修改和删除,同时也可以创建新的元素。
- DOM独立于平台和编程语言。它可以被任何编程语言诸如Java、JavaScript和VBScript使用。
- DOM对象,即是我们用传统的方法(JavaScript)获得的对象。
- DOM,准确的说是对文档对象的一种规范标准(文档对象模型),标准只定义了属性和方法行为。
二、jQuery对象
jQuery对象: 其实是一个JavaScript的数组,这个数组包含125个方法和4个属性。jQuery对象即是用jQuery类库的选择器获得的对象。
- 4个属性
- jquery:当前jquery框架版本号
- length:只是该数组对象的元素个数
- context:一般情况下都是HtmlDocument对象
- selector:传递进来的选择器内容
- 平时用到的jQuery对象都是通过 ( ) 函数制造出来的, ()函数制造出来的, ()函数制造出来的,()函数就是一个jQuery对象的制造工厂。
- jQuery对象无法使用DOM的方法,DOM对象也无法使用jQuery对象的方法:
- jQuery对象方法:$(“#id”).html() $(“#id”).attr(“checked”)
- DOM对象方法:document.getElementById(“id”).innerHTML;document.getElementById(“id”).checked
三、JavaScript对象
JavaScript对象:通过js获取的DOM对象就是js对象。
- JavaScript提供多个内建对象,如String、Date、Array等。
- 当浏览器支持js的DOM接口时,这里狭义的DOM对象是以js对象的形式出现的,也就是一个js对象。
四、jQuery对象和DOM对象的相互转换
- jQuery对象:var $obj = $(“#id”)
- DOM对象: var domObj = document.getElementById(“id”)
- jQuery对象转换为DOM对象
- var domObj = $(“#cr”)[0] 或者 var domObj = $(“#cr”).get(0)
- DOM对象转换为jQuery对象
- var $obj = $(document.getElementById(“#cr”))
反射和动态代理
一、反射
在程序运行时中,能获取任意一个类的所有方法和属性,能调用任意一个对象的所有方法和属性;这种动态获取的信息及动态调用对象方法的功能称为反射机制。
1.作用
-
在运行时构造任意类的对象
-
在运行时调用任意对象的方法和属性
-
在运行时判断任意对象所属的类
-
在运行时判断任意类所具有的方法和属性
-
在运行时创建新类的对象
-
生成动态代理
2.示例
3.优缺点
- 优点:可实现动态创建对象和编译,具有高度灵活性。
- 缺点:反射是一种解释操作,对程序性能有影响。
二、动态代理
静态代理:代理类在程序运行前就已经存在。通常静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类。在代理类、委托类运行之前已经以.class文件形式存在。
动态代理:代理类在程序运行时创建。也就是说代理类并不是在java代码中定义的,而是在运行时根据java代码的指示动态生成的。
1.静态代理和动态代理的区别
- 代理类生成的方式不同,静态代理中代理类是在程序中定义的,动态代理中代理类是在程序运行时动态生成的。
- 动态代理可以很方便地对代理类的函数进行统一的处理,而不用修改每个代理类的函数;静态代理实现相同的需求需要在每一个代理类中添加相应的逻辑。
2.注意事项
- Proxy.newProxyInstance创建的代理对象是在JVM运行时动态生成的对象,它并不是InvocationHandler类型,也不是我们定义的那组接口的类型,命名方式为:$proxy + 数字(表示对象的标号)。三个参数分别为:委托类的类构造器、委托类实现的所有接口、代理类。
- Java中通常使用接口来管理动态代理。
- 对代理类方法的调用,实际上都会调用代理类(调用处理器)的invoke方法,在invoke方法中调用委托类的方法,并且可以加入自己的处理逻辑。
三、 JDK动态代理和CGLIB动态代理
- 原理
- JDK动态代理是利用反射机制生成一个实现代理接口的匿名类,再调用具体方法前调用InvocationHandler来处理。
- CGLIB动态代理是利用ASM开源包,对代理对象类的class文件加载进来后修改其字节码文件生成子类来处理(覆盖其中的方法)。
- 应用
- 如果目标对象实现了接口,默认会采用JDK动态代理实现AOP,否则则采用CGLIB动态代理。CGLIB动态代理不能对生命为final的方法进行代理,因为CGLIB的原理是动态生成代理类的子类。
- 强制使用CGLIB动态代理
- 添加CGLIB库,SPRING_HOME/cglib/*.jar
- 在Spring的配置文件中加入 <aop:aspectj-autoproxy proxy-target-class=“true”/>
- CGLIB动态代理比JDK动态代理快
- Cglib底层采用ASM字节码生成框架,使用字节码技术生成代理类比使用Java反射效率要高。
EJB和JPA
一、EJB(Enterprise Java Beans)
**Java企业Bean,是Java的核心代码,分别是会话Bean(Session Bean)、实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。**在EJB3.0推出之后实体Bean被单独分离出来,形成了新的规范JPA。EJB是SUN的JavaEE服务器端组件模型。
二、JPA(Java Persistence API)
**Java持久层API,其宗旨是为POJO提供持久化标准规范,JPA的总体思想和现有的Hibernate、TopLink、JDO等ORM框架大体一致。**JPA包括以下三方面技术:
- ORM映射元数据:JPA支持XML和JDK1.5注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库中。
- API:用来操作实体对象,框架在后台替我们执行CRUD操作,开发者可以从繁琐的JDBC和SQL代码中解脱出来。
- 查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。