一、使用注解的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实现】的更多相关文章

  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. js点击某个图标或按钮弹出文件选择框

    <HTML> <head> <script type="text/javascript" src="script/jquery-1.6.2. ...

  2. BZOJ 3224: Tyvj 1728 普通平衡树

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9629  Solved: 4091[Submit][Sta ...

  3. IntelliJ IDEA 常用设置讲解

    说明 IntelliJ IDEA 有很多人性化的设置我们必须单独拿出来讲解,也因为这些人性化的设置让我们这些 IntelliJ IDEA 死忠粉更加死心塌地使用它和分享它. 常用设置 IntelliJ ...

  4. Linux 内核数据结构:双向链表

    Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为 ...

  5. mysql中bit_count和bit_or函数的含义

    翻阅mysql手册时,看到有个示例使用了bit_or方法来去除重复的数据,一开始没看明白,后来看明白之后感觉非常巧妙.示例要实现的功能就是计算每月有几天有访问,先把示例摘录在这里. 1 2 3 4 5 ...

  6. HTTP Content-type 对照表

    Application Type 文件扩展名 Content-Type(Mime-Type) 描述 . application/x-   .* application/octet-stream 二进制 ...

  7. 轻松理解spring IOC

    spring IOC(Inversion of control)即控制反转 概念:一,spring框架的核心之一 二,控制权由对象本身转向容器:由容器根据配置文件去创建实例并创建各个实例之间的依赖关系 ...

  8. Tomcat SSL的安装及配置中遇到问题

    配置tomcat服务器利用SSL进行加密. 一.生成密钥库 具体生成方式就不讲了,tomcat支持的keystore的格式有JKS,PKCS11和PKCS12 JKS是jdk /bin目录下keyto ...

  9. 利用Render Texture实现游戏的小雷达效果(摄影机分屏)

    最近游戏蛮牛在举办一个活动,就是要做出这样的效果: 题目:实现游戏分屏效果 要求:1.        分屏,且分割线不规则(即非水平或垂直):2.        各屏可单独操作(移动.缩放),操作指该 ...

  10. “基础提供程序在Open上失败”

    本来布置在IP为[x.x.x.x]的WCF服务好好的,但是今天突然就有问题了,一调用报错"基础提供程序在Open上失败"... 服务器上的有问题,先试试本地的服务能不能用吧,连的都 ...