Spring2.5注释语法(上)——Spring2.5注释驱动的IoC

spring2.5.6注解以及xml简单ioc入门示例 spring2.5.6注解以及xml两个简单ioc入门示例项目,导入项目可运行。 同时带有spring-framework-2.5.6-with-docs.zip包 立即下载

http://tonyaction.blog.51cto.com/227462/107451

 

Spring2.5 注释语法( 上)
            ——Spring2.5 注释驱动的IoC
 
  正如Spring 框架的名称一样,它真的为我们JavaEE 开发带来了一阵春风,而其著名的IoC ( 依赖注入) 更是为它的经久不衰注入了无限活力。在新发布的2.5 版本中Spring 的开发者为我们这些使用Java5 或更高版本Java 的开发人员提供了进一步简化而强大的新特性。其中就包括了注释驱动的依赖性注入(annotation-driven dependency injection )和新的web 控制器模型将请求映射到加注释的方法上,等等。
  今天我首先要向大家介绍的就是Spring2.5 中新特性之一--- 注释驱动的依赖性注入,在正式介绍之前我想先让大家了解一下什么是注释,请看下面的代码清单:
一、了解Java 注释
代码清单1.1
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
 
@Retention(RetentionPolicy.RUNTIME )
public @interface MyAnnotation { ①定义一个注释
int init();
}
 
  代码清单1.2
import java.lang.annotation.Annotation;
public class TestAnnotation {
  @MyAnnotation(init = 2) ②使用注释
  public void print(){
     System.out .println(TestAnnotation.class .getName());
  }
  public static void main(String[] args) throws Exception{
     TestAnnotation ta = new TestAnnotation();
     Annotation[] annotations = ta.getClass().getMethod("print").getAnnotations(); ③
     for (Annotation annotation : annotations)  {             
         System.out .println("MyAnnotation.init : " +
       ((MyAnnotation)annotation).init()); ④打印出init 的值
        }
  }
}
在代码清单1.1 中我们定义了一个名为MyAnnotation 的注释而这个注释中只有一个类型为int 名为init 的属性,代码清单1.2 中我们在② 处使用了我们刚刚定义的注释并且为init 赋值为2 ,在③ 处我们通过反射机制获得print 方法上定义的所有注释然后通过迭代将其值init 打印至控制台。
最终在控制台输出以下信息:
MyAnnotation.init : 2
  至此我们对Java 中的注释有了一个简单的了解,下面我们来看看Spring2.5 是如何使用这些注释来完成它神奇的IoC 功能吧。在此之前我们先来看看以前我们是怎么做的。
二、Spring 的IoC
代码清单2.1
public class Foo { ①
  private String name;
  private int age;
  public String toString(){
     return "The Foo's Name is : " + this .name + " The Foo's Age is : " + this .age;
  }
  public String getName() {...}
  public void setName(String name) {...}
  public int getAge() {...}
  public void setAge(int age) {...}
}
代码清单2.2
public class Bar { ②
  private String address;
  public String toString(){
     return "The Bar's Address is : " + this .address;
  }
  public String getAddress() {...}
  public void setAddress(String address) {...}
}
代码清单2.3
public class Base { ③
  private Foo foo;
  private Bar bar;
  public String toString(){
     return "Base : [" + this .foo.toString() +" "+ this .bar.toString()+ "]";
  }
  public Foo getFoo() {...}
  public void setFoo(Foo foo) {...}
  public Bar getBar() {...}
  public void setBar(Bar bar) {...}
}
代码清单2.4
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="..." >
  <bean id="foo" class="com.tony.test.Foo" >
     <property name="name" value="Tony" />
     <property name="age" value="27" />
  </bean >
  <bean id="bar" class="com.tony.test.Bar" >
     <property name="address" value="China Tianjin" />
  </bean>
  <bean id="base" class="com.tony.test.Base" >
     <property name="foo" >
        <ref local="foo" />
     </property>
     <property name="bar" >
        <ref local="bar" />
     </property>
  </bean>
</beans>
代码清单2.5
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainClass { ④
  public static void main(String[] args) {   
        String[] locations = {"spring-config-beans.xml"};   
        ApplicationContext ctx = new ClassPathXmlApplicationContext(locations);   
        Base main = (Base) ctx.getBean("base"); ⑤  
        System.out.println(main); ⑥  
   }
}
我们来看看上面代码的含义,首先在代码① 和② 处我们分别定义了两个名为Foo 和Bar 的Bean ,在③ 处我们通过set 方法将两个Bean 注入进Base 类中,并且在Base 类中定义了toString 方法来打印出Foo 和Bar 的信息, 在④ 处我们定义了一个MainClass 来执行我们的代码, 在⑤ 处我们通过getBean 获得配置文件中配置的id 为base 的Bean 并在⑥ 出将其信息打印至控制台, 控制台输出信息如下:
Base : [The Foo's Name is : Tony The Foo's Age is : 27 The Bar's Address is : China Tianjin]
看到上面习以为常的配置信息和set get 方法我们根本不会有任何想法,可是当我们看到了Spring2.5 注释特性的时候我们发现自己真的错了,程序竟然还可以写成这么简单。
三、使用@Autowired 注释
经过了一番整理我们把改好了。
代码清单3.1
import org.springframework.beans.factory.annotation.Autowired;
public class Base {
  @Autowired ① 使用了一个名为Autowired 的注释
  private Foo foo;
  @Autowired ②
  private Bar bar;
  public String toString(){
     return "Base : [" + this .foo.toString() +" "+ this .bar.toString()+ "]";
  }
}
代码清单3.2
  <!-- 该 BeanPostProcessor 将自动对标注 @Autowired 的 Bean 进行注入 --> ③ 
  <bean class="org.springframework.beans.factory.annotation.
                              AutowiredAnnotationBeanPostProcessor" />
 
  <bean id="foo" class="com.tony.test.Foo" >
     <property name="name" value="Tony" />
     <property name="age" value="27" />
  </bean>
  <bean id="bar" class="com.tony.test.Bar" >
     <property name="address" value="China Tianjin" />
  </bean>
  <!-- 此时移除了Base 的配置信息 --> ④
  <bean id="base" class="com.tony.test.Base" />
以上的代码清单中我们在① 和② 处使用了 @Autowired 注释, 它可以对类的成员变量、方法及构造函数进行标注,完成自动装配的工作,在③ 处我们为了使 @Autowired 注释 生效必须在Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean 它通过 扫描 Spring 容器中所有 Bean ,当发现 Bean 中拥有 @Autowired 注释时就找到和其相匹配(默认按类型匹配)的 Bean ,并将其注入 , 而此时我们在声明Base 的时候( ④ 处) 就不用写它的配置信息了,更可以将Base 类中的set 和get 方法删除。 @Autowired 还可以通过类的构造函数来进行自动装配。
代码清单3.3
import org.springframework.beans.factory.annotation.Autowired;
public class Base {
  private Foo foo;
  private Bar bar;
  @Autowired
  public Base(Foo foo,Bar bar){ ①
     this .foo = foo;
     this .bar = bar;
  }
  public String toString(){
     return "Base : [" + this .foo.toString() +" "+ this .bar.toString()+ "]";
  }
}
在代码清单3.3 中我们增加了一个构造函数,通过它来对我们的成员变量进行赋值,我们同时也为这个构造函数添加了@Autowired 注释( ① 处)使其可以自动将Foo 和Bar 两个成员变量装配进来。
四、使用@Qualifier 注释
有时我们会遇到这样一种情况,我们定义了两个类型相同数据不同的Bean ,我们此时需要用到其中一个Bean 来供我们使用,使用@Qualifier 注释就可以满足我们的要求,当使用@Qualifier 注释时 自动注入的策略就从 byType 转变成 byName 了。
代码清单4.1
<bean id="bar" class="com.tony.test.Bar" > ①
  <property name="address" value="China Tianjin" />
</bean>
<bean id="bar2" class="com.tony.test.Bar" > ②
  <property name="address" value="China Beijing" />
</bean>
代码清单4.2
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class Base {
  private Bar bar;
  @Autowired  ③
  public Base(@Qualifier("bar2")Bar bar){  ④
     this .bar = bar;
  }
  public String toString(){
     return "Base : ["+ this .bar.toString()+ "]";
  }
}
代码清单4.1 中的 ① 和② 处我们分别定义了两个类型为Bar 的Bean ,② 处Bar 的address 为China Beijing 并且Bean 的名称为bar2 ,在代码清单4.2 的③ 处我们同样使用了@Autowired 注释为Bar 的构造函数进行自动装配,可是在④ 处我们通过@Qualifier("bar2") 来明确指定我们需要将id 为bar2 的Bean 装配进来。我们还可以为成员变量使用@Qualifier 注释。
代码清单4.3
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class Base {
  @Autowired ①
  @Qualifier("bar2") ②
  private Bar bar;
  public String toString(){
     return "Base : ["+ this .bar.toString()+ "]";
  }
}
代码清单4.3 中我们为成员变量bar 添加了两个注释① 处是我们已经很熟悉的@Autowired 注释,紧随其后的就是@Qualifier 注释。 @Qualifier 注释可以对成员变量、方法入参、构造函数入参进行标注,而我们最常用也最方便的就是为成员变量使用注释。
五、使用@Component 注释
使用了@Autowired 注释后我们发现自动注入真的非常简单,但是我们还是得在配置文件中定义相应的<Bean> ,如果我们能在配置文件中完全移除Bean 的定义那就更好了,Spring2.5 就为我们提供了这一可能。
代码清单5.1
import org.springframework.stereotype.Component;
@Component ①
public class Bar {
  private String address = "China Tianjin";
  public String toString(){
     return "The Bar's Address is : " + this .address;
  }
}
 
代码清单5.2
import org.springframework.stereotype.Component;
@Component("base") ②
public class Base {
  @Resource
  private Bar bar;
  public String toString(){
     return "Base : ["+ this.bar.toString()+ "]";
  }
}
 
代码清单5.3
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="..." >
  <context:component-scan base-package="com.tony.test"/> ③
</beans>
在代码清单5.1 中我们使用了一个 @Component 注释(① 处), 使用 @Component 注释就可以将一个类定义成为Spring 容器中的 Bean 。在代码清单5.2 的 ② 处我们也同样使用了@Component 注释,而此时我们使用了它提供的一个可选的入参将Bean 的名称定义为base ,最后在③ 处我们将以前定义Bean 的内容全部移除,添加了一行 <context:component-scan/> ,其中的 base-package 属性 指定了需要扫描的类包,它会自动递归下面的子包。
六、使用@Scope 注释
代码清单6.1
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Scope("prototype") ①
@Component("base")
public class Base {
  @Autowired
  private Bar bar;
  public String toString(){
     return "Base : ["+ this .bar.toString()+ "]";
  }
}

在代码清单6.1 中的① 处我们添加了一个@Scope 注释,这样当我们从 Spring 容器中获取 base 时,每次返回的都是一个新的实例了。

 

 

另外参见:http://www.infoq.com/cn/articles/spring-2.5-part-1


支持jdk1.8的spring-2.5.6.jar 支持jdk1.8的spring-2.5.6.jar, 解决“annotation-config are only available on JDK 1.5 and higher”的问题! 立即下载

相关推荐

spring2.5解决java8下报错jdk版本不对的问题

spring2.5解决java8下报错jdk版本不对的问题

Spring2.5注释驱动

注释语法越来越多的被业界所使用,并且注释配置相对于 XML 配置具有很多的优势:它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。注释和 Java 代码位于一个文件中,而 XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和 Java 代码放在一起,有助于增强程序的内聚性。而采用独立的 XML 配置文件,程序员在编写一个功能时,

zhangzeqin的专栏 484

[V-10]ARMv8/v9-CPU Virtualization-CPU虚拟化架构简介(vCPU/vPE)

本文简要介绍了CPU虚拟化架构的基础知识。

基层架构师的分享 1267

SpringMVC注解驱动的控制器详解

Spring2.5引入注解式处理器支持,通过@Controller和@RequestMapping注解定义我们的处理器类。并且提供了一组强大的注解需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter来开启支持@Controller和@RequestMapping注解的处理器。

Evankaka的专栏 8063

【PB03F 超详细-环境搭建】蓝牙5.2安信可PB-03F-Kit开发板二次开发环境搭建

PB-03是由深圳市安信可科技有限公司开发的蓝牙模块。本博文介绍安信可PB-03F-Kit开发板的基本情况、开发环境搭建,以及以点亮LED为例介绍程序编写和固件烧录的操作流程。 安信可PB-03F-Kit开发板使用的PHY6252这样一款高集成度的低功耗蓝牙系统级芯片(SoC),专为物联网(IoT)、移动设备、可穿戴电子设备、智能家居等各种应用而设计。......

qq_44078824的博客 1万+

用SPSS做信效度分析

对问卷进行Cronbach’s Alpha信度检验。如果此值高于0.8,则说明信度高;如果此值介于0.7-0.8之间,则说明信度较好;如果此值介于0.6~0.7,则说明信度可接受;如果此值小于0.6,说明信度不佳。下面利用SPSS进行分析,点击分析–标度–可靠性分析选项,选中所要分析的问卷数据或题目。得到结果,我们要看这个有用的结果,当克隆巴赫Alpha系数(也可以看标准化后的)大于0.8时候,说明问卷信度较高。

小高~的博客 1万+

关于spring框架中的注解驱动

先说最常用的三个注解驱动的配置 1、在springmvc框架中,想要使用mvc,就要使用mvc:annotation-driven/>mvc的注解驱动,springmvc工作需要处理器映射器和处理器适配器,使用了这个配置就可以直接使用@Controller,进行web层的注解。 2、在整个项目的流程中,spring对类的实例化,以及类和类之间的关系就需要 组件扫描,使用组件扫描可以扫描指定包

leozhou13的博客 7747

【ros2】从零认识URDF:机器人模型描述的“说明书”

visual>子节点只负责机器人在RViz2中的可视化效果,不参与任何物理计算,就像给零件“穿衣服”。<origin>:定义零件的局部坐标系相对于连杆原点的位姿,参数xyz表示平移(单位:米),rpy表示旋转(单位:弧度,绕x→y→z轴旋转);<geometry>:定义零件的几何形状,支持四种基础形状+外部3D模型;<material>:定义零件的颜色,需要提前定义材质。常见几何形状示例-- 连杆名称:base_link(底座),全局唯一 --> < visual > <!

EnHengNa的博客 1614

STM32F407读写保护RDP=0解锁实战:绕过ST-Link用串口唤醒

STM32的读出保护(RDP)是一种硬件级安全机制,当RDP等级设为Level 0时,芯片会封锁Flash访问、调试接口及系统存储器Bootloader,导致ST-Link无法连接、Flymcu报‘芯片超时无应答’。其原理在于RDP=0触发了硬件门控电路,使UART外设未初始化、SWD引脚高阻态,形成启动死循环。技术价值在于提供低成本、免调试器的恢复路径,适用于产线救砖、现场维护与嵌入式固件安全运维。典型应用场景包括串口下载失败排查、BOOT0无效诊断、量产板RDP误触发应急处理。本文聚焦RDP=0状态下的

weixin_33912638的博客 339

在pycharm2021.2中学习opencv图像处理,基于python3.9.7、pycharm完成配置

在pycharm中学习opencv图像处理安装python下载python安装包开始安装安装pycharm社区版下载pycharm开始安装如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 安装python 使用pycharm学习opencv应该是最简单的了,对新手比较友好,

steveqobs 7708

【实战指南】RF-DETR目标检测全流程:从数据准备到工业部署

本文详细介绍了RF-DETR目标检测模型的全流程应用,从数据准备、模型训练到工业部署。RF-DETR作为基于Transformer的先进模型,在COCO基准测试中表现优异,推理速度超越YOLOv8,特别适合工业场景。文章还提供了数据标注、COCO格式转换、超参数调优及边缘设备部署的实用技巧,帮助开发者高效实现目标检测任务。

weixin_29081101的博客 421

Spring2.5注释语法(上)—— Spring2.5注释驱动的IoC

  正如Spring 框 架的名称一样,它真的为我们JavaEE 开发带来了一阵春风,而其著名的IoC ( 依赖注入) 更是为它的经久不衰注入了无限活 力。在新发布的2.5 版本中Spring 的 开发者为我们这些使用Java5 或更高版本Java 的 开发人员提供了进一步简化而强大的新特性。其中就包括了注释驱动的依赖性注入(annotation-driven dependency injection )和新的web 控制器模型将请求映射到 加注释的方法上,等等。  今天我

260

物联网通信中NB-IoT、Cat.1、LTE-M该如何选择?

首先我们要确定我们产品的关键需求,例如:我们的设备是否对数据传输速率有较高的要求,有较高要求我们就需要选择较高传输速率的Cat.1来开发我们的产品。同时关于产品性能方面,我们对功耗、延迟、可靠性也会有所要求,例如我们的产品为移动端产品,不方便布线以及安装电源,那我们就会采用电池供电的方式,所以在选择时可以优先考虑低功耗产品,最终结合其他需求选择出合适的协议。首先,我们需求的产品是不同的,我们需要根据产品需求或项目需求来进行选择,NB-IoT、Cat.1、Cat.M都有属于自己的优势。

a1809032425的博客 1216

使用 Spring 2.5 注释驱动的 IoC 功能——@Autowired

于注释(Annotation)的配置有越来越流行的趋势,Spring 2.5 顺应这种趋势,提供了完全基于注释配置 Bean、装配 Bean 的功能,您可以使用基于注释的 Spring IoC 替换原来基于 XML 的配置。本文通过实例详细讲述了 Spring 2.5 基于注释 IoC 功能的使用。   概述     注释配置相对于 XML 配置具有很多的优势:     它可以充分利用 Java ...

zhangjunji111的博客 187

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

使用 Spring 2.5 注释驱动的 IoC 功能

使用 Spring 2.5 注释驱动的 IoC 功能 source:http://www.ibm.com/developerworks/cn/java/j-lo-spring25-ioc/   陈 雄华 (quickselect@163.com), 技术总监, 宝宝淘网络科技有限公司 陈雄华,2002 年毕业于厦门大学计算机与信息工程学院,获硕士学位。是宝宝淘科技有限公司的

GeneralYY0的专栏 872

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【总结】使用 Spring 2.5 注释驱动的 IoC 功能

原来也看过关于 Spring 2.5 关于注释方面的新特性,但是一直没有一个全面的了解。看完了 IBM developerWorks 上的《[url=http://www.ibm.com/developerworks/cn/java/j-lo-spring25-ioc/?ca=drs-tp0808]使用 Spring 2.5 注释驱动的 IoC 功能[/url]》 后,对这方面的知识有了全面的了解...

「理」尚往来 169

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

(转)使用Spring2.5的Autowired实现注释型的IOC

使用Spring2.5的Autowired实现注释型的IOC

hitlermen的专栏 914

Spring2.5注释语法

[size=large][b]Spring的IoC[/b][/size] [code="java"]public class Foo {① private String name; private int age; public String toString(){ return "The Foo's Name is : " + this.name + " The ...

firecool2011的专栏 148
上一篇: Spring REST配置指南与问题总结
下一篇: @Entity Table Configuration
sukyle
博客等级 码龄18年 41粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值