一、使用注解的DI实现

  1.@Resource

    使用该注解能够实现引用型属性的DI实现,该注解能够根据属性名和属性类型自动给属性赋值。一般使用@Resource(name="student")的形式明确指定名称,这样就只能根据属性名来填充值了。

    步骤:

      (1)导入命名空间:命名空间示例

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-2.5.xsd">
  9.  
  10. <context:annotation-config/>
  11.  
  12. </beans>

applicationContext.xml

      (2)导入依赖注入的注解解析器

  1. <context:annotation-config></context:annotation-config>

      (3)将bean导入进来,例:

  1. <bean id="person" class="com.kdyzm.spring.di.Person"></bean>
  2. <bean id="student" class="com.kdyzm.spring.di.Student"></bean>

    示例配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  6. http://www.springframework.org/schema/context
  7. http://www.springframework.org/schema/context/spring-context-2.5.xsd
  8. ">
  9. <!-- 该标签位置不能改变 -->
  10. <context:annotation-config></context:annotation-config>
  11. <!-- 使用该注解的话不需要再在xml文件中进行配置了 -->
  12. <bean id="person" class="com.kdyzm.spring.di.Person"></bean>
  13. <bean id="student" class="com.kdyzm.spring.di.Student"></bean>
  14. </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标签。

    配置方式:同样需要导入依赖注入的注解解析器

  1. <context:component-scan base-package="com.kdyzm.spring.annotation.scan"></context:component-scan>

    @Component可以细分为三个部分:@Repository、@Service、@Controller,对应着持久化层、服务层、控制层,用法和@Component相同,推荐使用后者,原因是被注解的类或许能够更好地被工具处理或者与切面进行关联。

二、spring中的继承

  1.使用普通方法的继承创建子类对象之后不能继承父类的成员变量,调用父类的get方法也不能获取父类的成员变量。指定bean的parent属性能够解决该问题。

  1. <bean id="person" class="com.kdyzm.spring.extend.Person">
  2. <property name="name" value="Person"></property>
  3. </bean>
  4. <bean id="student" class="com.kdyzm.spring.extend.Student" parent="person"></bean>

  2.使用abstract属性标记bean为抽象bean,这样spring就不会实例化该bean了。

  1. <bean id="person" class="com.kdyzm.spring.extend.Person" abstract="true">
  2. <property name="name" value="Person"></property>
  3. </bean>

    疑问:abstract属性默认值是true?并不管用,仍然实例化了。

三、动态代理复习:伪模拟hibernate的过程实现

  1.动态代理的本质实际上就是方法增强

    实现了InvocationHandler接口的类相当于一个“拦截器”。

  2.实例。

  1. package com.kdyzm.spring.proxy;
  2.  
  3. public class Transaction {
  4. public void startTransaction(){
  5. System.out.println("开启事务!");
  6. }
  7. public void commit(){
  8. System.out.println("提交事务!");
  9. }
  10. }

com.kdyzm.spring.proxy.Transaction.java

  1. package com.kdyzm.spring.proxy;
  2.  
  3. public class Person {
  4. private String name;
  5.  
  6. public Person(String name) {
  7. this.name = name;
  8. }
  9.  
  10. public Person() {
  11. }
  12.  
  13. public String getName() {
  14. return name;
  15. }
  16.  
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20.  
  21. @Override
  22. public String toString() {
  23. return "Person [name=" + name + "]";
  24. }
  25. }

com.kdyzm.spring.proxy.Person.java

  1. package com.kdyzm.spring.proxy;
  2.  
  3. public interface PersonDao {
  4. public void savePerson();
  5. public Person getPerson();
  6. public void updatePerson();
  7. public void deletePerson();
  8. }

com.kdyzm.spring.proxy.PersonDao.java

  1. package com.kdyzm.spring.proxy;
  2.  
  3. public class PersonDaoImpl implements PersonDao {
  4.  
  5. @Override
  6. public void savePerson() {
  7. System.out.println("保存学生!");
  8. }
  9.  
  10. @Override
  11. public Person getPerson() {
  12. Person p=new Person();
  13. p.setName("狗蛋");
  14. return p;
  15. }
  16.  
  17. @Override
  18. public void updatePerson() {
  19. System.out.println("更新学生信息!");
  20. }
  21.  
  22. @Override
  23. public void deletePerson() {
  24. System.out.println("删除学生!");
  25. }
  26.  
  27. }

com.kdyzm.spring.proxy.PersonDaoImpl.java

最重要的一个类:拦截器类com.kdyzm.spring.proxy.PersonDaoInterceptor.java,实现了InvocationHandler接口

  1. package com.kdyzm.spring.proxy;
  2.  
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5.  
  6. /*
  7. * 定义拦截器,这是核心类。
  8. */
  9. public class PersonDaoInterceptor implements InvocationHandler{
  10. private Transaction transaction;
  11. private Object target;
  12. public PersonDaoInterceptor(Object target,Transaction transaction) {
  13. this.target=target;
  14. this.transaction=transaction;
  15. }
  16. @Override
  17. public Object invoke(Object proxy, Method method, Object[] args)
  18. throws Throwable {
  19. String methodName = method.getName();
  20. Object result=null;
  21. if("savePerson".equals(methodName)||"updatePerson".equals(methodName)||"deletePerson".equals(methodName)){
  22. this.transaction.startTransaction();
  23. result=method.invoke(this.target, args);
  24. this.transaction.commit();
  25. }
  26. else{
  27. result=method.invoke(this.target, args);
  28. }
  29. return result;
  30. }
  31.  
  32. }

测试类:com.kdyzm.spring.proxy.Test.java

  1. package com.kdyzm.spring.proxy;
  2.  
  3. import java.lang.reflect.Proxy;
  4.  
  5. public class Test {
  6. public static void main(String[] args) {
  7. PersonDao target=new PersonDaoImpl();
  8. Transaction transaction = new Transaction();
  9. PersonDaoInterceptor daoInterceptor = new PersonDaoInterceptor(target, transaction);
  10. PersonDao proxy=(PersonDao) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), daoInterceptor);
  11. Person p=proxy.getPerson();
  12. System.out.println(p.getName());
  13. proxy.savePerson();
  14. }
  15. }

运行结果:

    

【Java EE 学习 50】【Spring学习第二天】【使用注解的DI实现】【spring中的继承】【动态代理伪hibernate实现】的更多相关文章

  1. 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)

    轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...

  2. Spring中的cglib动态代理

    Spring中的cglib动态代理 cglib:Code Generation library, 基于ASM(java字节码操作码)的高性能代码生成包 被许多AOP框架使用 区别于JDK动态代理,cg ...

  3. Spring中的JDK动态代理

    Spring中的JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层 ...

  4. Spring多种注入方式及注解实现DI

    一.Bean作用域 spring容器创建的时候,会将所有配置的bean对象创建出来,默认bean都是单例的.代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构 ...

  5. Java中的JDK动态代理

    所谓代理,其实就是相当于一个中间人,当客户端需要服务端的服务时,不是客户直接去找服务,而是客户先去找代理,告诉代理需要什么服务,然后代理再去服务端找服务,最后将结果返回给客户. 在日常生活中,就拿买火 ...

  6. Java EE 之 过滤器入门学习与总结(2)

    今天就对使用Filter技术能做什么来个小小的归纳.也为了方便今后的复习. 控制浏览器不进行对jsp页面的缓存 //在doFilter方法中添加这样的代码 HttpServletRequest req ...

  7. Java EE 之 过滤器入门学习与总结(1)

    使用Filter技术来配合开发会使得开发变得简单起来.简单的一个例子就表现在"乱码问题"上.不使用Filter的话,我们有可能需要为每一个网页设置字符编码集,如request.se ...

  8. spring in action 学习笔记十四:用纯注解的方式实现spring mvc

    在讲用纯注解的方式实现springmvc之前先介绍一个类:AbstractAnnotationDispatcherServletInitializer.这个类的作用是:任何一个类继承AbstractA ...

  9. spring mvc 第二天【注解实现springmvc Handler处理ajax简单请求 的配置】

    这里使用的是在前台发起ajax请求Handler,后台伪造数据响应给前台, 配置对应ajax请求的Handler信息如下 @Controller public class MyController { ...

随机推荐

  1. TCP/IP协议

    1.为什么有了IP地址还需要MAC地址? 首先,数据或者信息在网络上的传输需要两个地址:目的地址和下一跳地址.其中IP地址就是目的地址,而MAC地址则是下一跳地址.目的地址在经过路由器转发的时候是不会 ...

  2. 软件开发学习笔记 <二>软件开发模型、Up、Rup、敏捷Up

    软件开发过程(process) 是一个将用户需求转化为软件系统所需要的活动的集合. 软件生命周期(SDLC,Software Devlopment Life Cycle) 软件从孕育.诞生.成长.成熟 ...

  3. 解决:MIUI 8应用商店下载不了软件 APP

    MIUI 8应用商店下载不了软件,是什么原因呢? 原因是:刷了国际版的MIUI,然后又刷回国内的MIUI,刷机时数据没有清理干净. 解决办法:使用RE管理器或者其他第三方可以编辑系统文件的文件管理器, ...

  4. VsFtpd服务配置简明笔记

    Ftp服务是最常用的文件传输方式,把配置步骤记录下来,以备将来使用. 1.用YUM安装VsFtpd服务:[root@Redis usr]# yum install vsftpd 2.安装完成后启动Vs ...

  5. oracle中将自建用户下的所有表删除

    select 'drop table '||table_name||' ;' from user_tables;select 'drop sequence '||sequence_name||' ;' ...

  6. 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 ...

  7. mosquitt win32

    软件 mosquitto-1.4.10-install-win32.exe. 安装时候提示下载后面两个.win32openssl一定是1_0_1,否则没有需要的dll文件. pthreadVC2.dl ...

  8. java 判断String 是否为空

    StringUtils.isBlank(null) = true StringUtils.isBlank("") = true StringUtils.isBlank(" ...

  9. Angular.js实现折叠按钮的经典指令.

    var expanderModule=angular.module('expanderModule',[]) expanderModule.directive('expander',function( ...

  10. asp rs开启关闭问题

    使用rs.close关闭后,可以直接用rs.open来打开数据表:如果用了set rs = nothing 从内存中清除rs对象,再次加载rs对象就需要使用set rs=server.createob ...