Spring基于注解的配置1——@Required、@Autowired、@Qualifier示例及与传统注入方法的对比
@Required注释
作用:用于属性的set方法,那么这个属性必须在xml文件的bean标签里面进行配置,否则就会抛出一个BeanInitializationException异常。
首先准备一个类:
public class Person{
private int age;
private String name;
@Required
public void setAge(int age) {
this.age = age;
}
public Integer getAge() {
return age;
}
@Required
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
再准备一个测试类:
public class MainApp{
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("person.xml");
Person person = (Person) context.getBean("p");
System.out.println("Name : " + student.getName() );
System.out.println("Age : " + student.getAge() );
}
}
配置文件内容如下:
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
//必须加上这个标签,后面几个注释的配置文件也一样。
<context:annotation-config/> <bean id="p" class="Annotations.injection.Person">
<property name="name" value="张三 />
<property name="age" value="18"/>
</bean>
</beans>
大家可以自行把<property name="age" value="11"/>或者 <property name="name" value="Zara" />注释掉,看看是否会报错。上面的代码才是完整的。
输出结果:
Name : 张三
Age : 11
@Autowired
作用:这个标签在不同的部位前面,作用也不一样。但是总的来说,作用基本和其名字一样,自动连线,只是连线对象不一样了。
当在一个set方法前,即使我们没在bean里面配置他的值或引用,它也会在beans里面寻找相同类型的bean去匹配,就如byType一样。
当在一个属性前,这个属性可以不需要set方法。
当在一个构造函数前,尤其是有参构造函数,即使我们不给这个构造函数传参,它也会在beans里寻找相同类型的bean,并传递给这个构造函数。
下面分别演示和对比其作用。
在set方法前
首先准备一个类,在其set方法前加上Autowired注释:
public class Hello {
private Hello_Son hs;
public Hello_Son getHs() {
return hs;
}
@Autowired
public void setHs(Hello_Son hs) {
this.hs = hs;
}
}
为了方便演示,再准备一个类当自定义类型:
public class Hello_Son {
public Hello_Son(){
System.out.println("这是hello_son的无参构造函数");
}
}
测试类:
public class MainApp {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("ann_bean.xml");
Hello h=(Hello)context.getBean("hello");
h.getHs();
}
}
区别对比:
使用了Autowired注释的配置文件内容如下:
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean id="hello" class="Annotations.injection.Hello">
</bean>
<bean id="hs" class="Annotations.injection.Hello_Son"/>
</beans>
不使用Autowired注释的配置文件内容如下:
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean id="hello" class="Annotations.injection.Hello">
<!-- 需要手动配置-->
<property name="hs" ref="hs"></property>
</bean>
<bean id="hs" class="Annotations.injection.Hello_Son"/>
</beans>
运行结果:
这是hello_son的无参构造函数
在属性前(在set方法前和在属性前结果一样,所以一般用这个)
首先准备一个类,无需set方法:
public class Hello {
@Autowired
private Hello_Son hs; public Hello_Son getHs() {
return hs;
} }
自定义类型类和上面一样。
配置文件和上面一样。
区别对比:
使用了Autowired注释的属性,不需要set方法。
不使用Autowired注释的属性,需要set方法。
运行结果:
这是hello_son的无参构造函数
在构造函数前
首先准备一个类:
public class Hello {
private Hello_Son hs;
@Autowired
public Hello(Hello_Son hs) {
System.out.println("这是hello的有参构造函数");
this.hs=hs;
}
public Hello_Son getHs() {
return hs;
}
}
自定义类型类和配置文件不变。
区别对比:
使用了Autowired注释的构造函数的配置文件:
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean id="hello" class="Annotations.injection.Hello">
</bean>
<bean id="hs" class="Annotations.injection.Hello_Son"/>
</beans>
不使用Autowired注释的构造函数的配置文件:
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean id="hello" class="Annotations.injection.Hello">
<constructor-arg ref="hs"/>
</bean>
<bean id="hs" class="Annotations.injection.Hello_Son"/>
</beans>
运行结果:
这是hello_son的无参构造函数
这是hello的有参构造函数
@Qualifier
作用:当创建多个相同类型的bean时,在使用时,只需要配置其中一个,那么这时候就可以使用@Qualifier注释。
首先创建一个类:
public class students {
private int age;
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public void setAge(int age) {
this.age = age;
} public int getAge() {
return age;
}
}
再为学生类创建一个配置类,方便使用:
public class stu_profile {
@Autowired
@Qualifier("stu1")
private students stu; public stu_profile() {
System.out.println("配置类的构造函数");
} public void getStu() {
System.out.println("名字叫:" + stu.getName() + ";" + "年龄:" + stu.getAge());
}
}
可以看到,配置类中指定了stu1,这个stu1就是一个bean的id。并和@Autowired一起使用,这样就不用再写个set方法了。
配置文件内容如下:
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/>
<bean id="profile" class="Annotations.injection.stu_profile"></bean>
<bean id="stu1" class="Annotations.injection.students">
<property name="age" value="18"/>
<property name="name" value="张三"/>
</bean>
<bean id="stu2" class="Annotations.injection.students">
<property name="name" value="李四"/>
<property name="age" value="19"/>
</bean> </beans>
测试类:
public class MainApp {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("students.xml");
stu_profile stu=(stu_profile)context.getBean("profile");
stu.getStu();
}
}
运行结果:
配置类的构造函数
名字叫:张三;年龄:18
Spring基于注解的配置1——@Required、@Autowired、@Qualifier示例及与传统注入方法的对比的更多相关文章
- Spring 基于注解零配置开发
本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址:< Spring 基于注解零配置开发 > 一:搜索Bean 再也不用在XML文件里写什么配置信息了. Sprin ...
- (spring-第4回【IoC基础篇】)spring基于注解的配置
基于XML的bean属性配置:bean的定义信息与bean的实现类是分离的. 基于注解的配置:bean的定义信息是通过在bean实现类上标注注解实现. 也就是说,加了注解,相当于在XML中配置了,一样 ...
- Spring 基于注解的配置 简介
基于注解的配置 从 Spring 2.5 开始就可以使用注解来配置依赖注入.而不是采用 XML 来描述一个 bean 连线,你可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身. ...
- Spring基于注解的配置概述
以下内容引用自http://wiki.jikexueyuan.com/project/spring/annotation-based-configuration.html: 从Spring 2.5开始 ...
- java Spring 基于注解的配置(一)
注解引用:1.service.xml 配置注解模式 <?xml version="1.0" encoding="UTF-8"?> <beans ...
- Spring基于注解@Required配置
基于注解的配置 从 Spring 2.5 开始就可以使用注解来配置依赖注入.而不是采用 XML 来描述一个 bean 连线,你可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身. ...
- Spring IoC — 基于注解的配置
基于XML的配置,Bean定义信息和Bean实现类本身是分离的,而采用基于注解的配置方式时,Bean定义信息即通过在Bean实现类上标注注解实现. @Component:对类进行标注,Spring容器 ...
- Spring框架bean的配置(3):基于注解的配置
1.基于注解的配置: @Component: 基本注解, 标识了一个受 Spring 管理的组件 @Respository: 标识持久层组件 @Service: 标识服务层(业务层)组件 @Contr ...
- 阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置
复制依赖和改jar包方式 src下的都复制过来. 复制到新项目里了 bean.xml里面复制上面一行代码到下面.把aop改成context. 配置spring容器创建时要扫描的包 Service的配置 ...
随机推荐
- 在npm上发布自己的vue组件库(使用npm install 或者 CDN的方式引用)
一.npm publish发布包到npm库的命令是npm publish npm publish发布包,需要先配置webpack.json文件,如果没有webpack.json文件,可以通过npm i ...
- CSS(1)---css语法、css选择器
CSS(1)---css语法.css选择器 一.CSS语法 1.CSS语法 CSS 规则由两个主要的部分构成:选择器以及一条或多条声明. 属性 是您希望设置的 样式属性.每个属性有一个属性值.属性和属 ...
- PHP JSON乱码简洁的解决办法
PHP JSON乱码简洁的解决办法 $arr = array('ret'=>400, 'msg'=>'服务器地址不允许', 'data'=>''); foreach ( $arr a ...
- 变量 + 数据类型(数字 + 字符串)(day03整理)
目录 一.上节课回顾 四 编程语言分类 (一) 机器语言 (二)汇编语言 (三) 高级语言 (四) 网络瓶颈效应 五.执行python程序两种方式 (一) 交互式(jupytre) (二) 命令行式( ...
- Spring IoC的概念
Spring IoC的基础知识 Spring 框架可以说是Java世界中最成功的框架,它的成功来自于理念,而不是技术,它最核心的理念是IoC(控制反转)和AOP(面向切面编程),其中IoC是Sprin ...
- 对比讲解lambda表达式与传统接口函数实现方式
在本号之前写过的一些文章中,笔者使用了lambda表达式语法,一些读者反映说代码看不懂.本以为java 13都已经出了,java 8中最重要特性lambda表达式大家应该都掌握了,实际上还是存在大量的 ...
- Java IO编程——文件拷贝
在操作系统里面有一个copy命令,这个命令的主要功能是可以实现文件的拷贝处理,现在要求模拟这个命令,通过初始化参数输入拷贝的源文件路径与拷贝的目标路径实现文件的拷贝处理. 需求分析: ·需要实现文件的 ...
- Lost My Music:倍增实现可持久化单调栈维护凸包
题目就是求树上每个节点的所有祖先中(ci-cj)/(dj-di)的最小值. 那么就是(ci-cj)/(di-dj)的最大值了. 对于每一个点,它的(ci,di)都是二维坐标系里的一个点 要求的就是祖先 ...
- [考试反思]0810NOIP模拟测试16:黎明
好吧,你尽力啦.我不说什么啦 []200 []180 [6]170 [7]160 [11]150 [12]140 还好,和前面的差距不大.虽说没有原来最好的那段时间考得那么好,但貌似还可以接受. 这次 ...
- 4、Hibernate的查询方式
一.Hibernate的查询方式:OID查询 1.OID检索:Hibernate根据对象的OID(主键)进行检索 1-1.使用get方法 Customer customer = session.get ...