【Java EE 学习 50】【Spring学习第二天】【使用注解的DI实现】【spring中的继承】【动态代理伪hibernate实现】
一、使用注解的DI实现
1.@Resource
使用该注解能够实现引用型属性的DI实现,该注解能够根据属性名和属性类型自动给属性赋值。一般使用@Resource(name="student")的形式明确指定名称,这样就只能根据属性名来填充值了。
步骤:
(1)导入命名空间:命名空间示例
- <?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-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd">
- <context:annotation-config/>
- </beans>
applicationContext.xml
(2)导入依赖注入的注解解析器
- <context:annotation-config></context:annotation-config>
(3)将bean导入进来,例:
- <bean id="person" class="com.kdyzm.spring.di.Person"></bean>
- <bean id="student" class="com.kdyzm.spring.di.Student"></bean>
示例配置文件:
- <?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-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd
- ">
- <!-- 该标签位置不能改变 -->
- <context:annotation-config></context:annotation-config>
- <!-- 使用该注解的话不需要再在xml文件中进行配置了 -->
- <bean id="person" class="com.kdyzm.spring.di.Person"></bean>
- <bean id="student" class="com.kdyzm.spring.di.Student"></bean>
- </beans>
注意事项:如果类中包含标准类型的属性变量,同时需要spring该该属性赋初值,那么该类就不能使用注解的形式给属性赋初值了。
2.@PostConstruct
该注解表名init方法,相当于bean标签的init-method属性的功能。
3.@PreDestroy
该注解表名destroy方法,相当于bean标签的destory-method属性的功能。
4.@Autowired
该注解是spring的注解,能够根据类型自动匹配。
5.@Qualifier(有疑问,注解的使用有问题)
该注解也是spring的注解,能够根据名称自动匹配
也就是说Autowired注解和Qualifier注解两个注解的功能合起来才能够顶的上Resource注解的功能,所以对于这两个注解,只是需要知道就行了,不需要进行掌握。一般使用Resource注解就足够用了。
6.@Component
该注解是spring的注解;用于扫描类并将其纳入spring容器中管理。功能相当于xml中的bean标签。
配置方式:同样需要导入依赖注入的注解解析器
- <context:component-scan base-package="com.kdyzm.spring.annotation.scan"></context:component-scan>
@Component可以细分为三个部分:@Repository、@Service、@Controller,对应着持久化层、服务层、控制层,用法和@Component相同,推荐使用后者,原因是被注解的类或许能够更好地被工具处理或者与切面进行关联。
二、spring中的继承
1.使用普通方法的继承创建子类对象之后不能继承父类的成员变量,调用父类的get方法也不能获取父类的成员变量。指定bean的parent属性能够解决该问题。
- <bean id="person" class="com.kdyzm.spring.extend.Person">
- <property name="name" value="Person"></property>
- </bean>
- <bean id="student" class="com.kdyzm.spring.extend.Student" parent="person"></bean>
2.使用abstract属性标记bean为抽象bean,这样spring就不会实例化该bean了。
- <bean id="person" class="com.kdyzm.spring.extend.Person" abstract="true">
- <property name="name" value="Person"></property>
- </bean>
疑问:abstract属性默认值是true?并不管用,仍然实例化了。
三、动态代理复习:伪模拟hibernate的过程实现
1.动态代理的本质实际上就是方法增强
实现了InvocationHandler接口的类相当于一个“拦截器”。
2.实例。
- package com.kdyzm.spring.proxy;
- public class Transaction {
- public void startTransaction(){
- System.out.println("开启事务!");
- }
- public void commit(){
- System.out.println("提交事务!");
- }
- }
com.kdyzm.spring.proxy.Transaction.java
- package com.kdyzm.spring.proxy;
- public class Person {
- private String name;
- public Person(String name) {
- this.name = name;
- }
- public Person() {
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @Override
- public String toString() {
- return "Person [name=" + name + "]";
- }
- }
com.kdyzm.spring.proxy.Person.java
- package com.kdyzm.spring.proxy;
- public interface PersonDao {
- public void savePerson();
- public Person getPerson();
- public void updatePerson();
- public void deletePerson();
- }
com.kdyzm.spring.proxy.PersonDao.java
- package com.kdyzm.spring.proxy;
- public class PersonDaoImpl implements PersonDao {
- @Override
- public void savePerson() {
- System.out.println("保存学生!");
- }
- @Override
- public Person getPerson() {
- Person p=new Person();
- p.setName("狗蛋");
- return p;
- }
- @Override
- public void updatePerson() {
- System.out.println("更新学生信息!");
- }
- @Override
- public void deletePerson() {
- System.out.println("删除学生!");
- }
- }
com.kdyzm.spring.proxy.PersonDaoImpl.java
最重要的一个类:拦截器类com.kdyzm.spring.proxy.PersonDaoInterceptor.java,实现了InvocationHandler接口
- package com.kdyzm.spring.proxy;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- /*
- * 定义拦截器,这是核心类。
- */
- public class PersonDaoInterceptor implements InvocationHandler{
- private Transaction transaction;
- private Object target;
- public PersonDaoInterceptor(Object target,Transaction transaction) {
- this.target=target;
- this.transaction=transaction;
- }
- @Override
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- String methodName = method.getName();
- Object result=null;
- if("savePerson".equals(methodName)||"updatePerson".equals(methodName)||"deletePerson".equals(methodName)){
- this.transaction.startTransaction();
- result=method.invoke(this.target, args);
- this.transaction.commit();
- }
- else{
- result=method.invoke(this.target, args);
- }
- return result;
- }
- }
测试类:com.kdyzm.spring.proxy.Test.java
- package com.kdyzm.spring.proxy;
- import java.lang.reflect.Proxy;
- public class Test {
- public static void main(String[] args) {
- PersonDao target=new PersonDaoImpl();
- Transaction transaction = new Transaction();
- PersonDaoInterceptor daoInterceptor = new PersonDaoInterceptor(target, transaction);
- PersonDao proxy=(PersonDao) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), daoInterceptor);
- Person p=proxy.getPerson();
- System.out.println(p.getName());
- proxy.savePerson();
- }
- }
运行结果:
【Java EE 学习 50】【Spring学习第二天】【使用注解的DI实现】【spring中的继承】【动态代理伪hibernate实现】的更多相关文章
- 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)
轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...
- Spring中的cglib动态代理
Spring中的cglib动态代理 cglib:Code Generation library, 基于ASM(java字节码操作码)的高性能代码生成包 被许多AOP框架使用 区别于JDK动态代理,cg ...
- Spring中的JDK动态代理
Spring中的JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层 ...
- Spring多种注入方式及注解实现DI
一.Bean作用域 spring容器创建的时候,会将所有配置的bean对象创建出来,默认bean都是单例的.代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构 ...
- Java中的JDK动态代理
所谓代理,其实就是相当于一个中间人,当客户端需要服务端的服务时,不是客户直接去找服务,而是客户先去找代理,告诉代理需要什么服务,然后代理再去服务端找服务,最后将结果返回给客户. 在日常生活中,就拿买火 ...
- Java EE 之 过滤器入门学习与总结(2)
今天就对使用Filter技术能做什么来个小小的归纳.也为了方便今后的复习. 控制浏览器不进行对jsp页面的缓存 //在doFilter方法中添加这样的代码 HttpServletRequest req ...
- Java EE 之 过滤器入门学习与总结(1)
使用Filter技术来配合开发会使得开发变得简单起来.简单的一个例子就表现在"乱码问题"上.不使用Filter的话,我们有可能需要为每一个网页设置字符编码集,如request.se ...
- spring in action 学习笔记十四:用纯注解的方式实现spring mvc
在讲用纯注解的方式实现springmvc之前先介绍一个类:AbstractAnnotationDispatcherServletInitializer.这个类的作用是:任何一个类继承AbstractA ...
- spring mvc 第二天【注解实现springmvc Handler处理ajax简单请求 的配置】
这里使用的是在前台发起ajax请求Handler,后台伪造数据响应给前台, 配置对应ajax请求的Handler信息如下 @Controller public class MyController { ...
随机推荐
- TCP/IP协议
1.为什么有了IP地址还需要MAC地址? 首先,数据或者信息在网络上的传输需要两个地址:目的地址和下一跳地址.其中IP地址就是目的地址,而MAC地址则是下一跳地址.目的地址在经过路由器转发的时候是不会 ...
- 软件开发学习笔记 <二>软件开发模型、Up、Rup、敏捷Up
软件开发过程(process) 是一个将用户需求转化为软件系统所需要的活动的集合. 软件生命周期(SDLC,Software Devlopment Life Cycle) 软件从孕育.诞生.成长.成熟 ...
- 解决:MIUI 8应用商店下载不了软件 APP
MIUI 8应用商店下载不了软件,是什么原因呢? 原因是:刷了国际版的MIUI,然后又刷回国内的MIUI,刷机时数据没有清理干净. 解决办法:使用RE管理器或者其他第三方可以编辑系统文件的文件管理器, ...
- VsFtpd服务配置简明笔记
Ftp服务是最常用的文件传输方式,把配置步骤记录下来,以备将来使用. 1.用YUM安装VsFtpd服务:[root@Redis usr]# yum install vsftpd 2.安装完成后启动Vs ...
- oracle中将自建用户下的所有表删除
select 'drop table '||table_name||' ;' from user_tables;select 'drop sequence '||sequence_name||' ;' ...
- Codeforces Round #342 (Div. 2) A. Guest From the Past(贪心)
传送门 Description Kolya Gerasimov loves kefir very much. He lives in year 1984 and knows all the detai ...
- mosquitt win32
软件 mosquitto-1.4.10-install-win32.exe. 安装时候提示下载后面两个.win32openssl一定是1_0_1,否则没有需要的dll文件. pthreadVC2.dl ...
- java 判断String 是否为空
StringUtils.isBlank(null) = true StringUtils.isBlank("") = true StringUtils.isBlank(" ...
- Angular.js实现折叠按钮的经典指令.
var expanderModule=angular.module('expanderModule',[]) expanderModule.directive('expander',function( ...
- asp rs开启关闭问题
使用rs.close关闭后,可以直接用rs.open来打开数据表:如果用了set rs = nothing 从内存中清除rs对象,再次加载rs对象就需要使用set rs=server.createob ...