Spring:基于注解的依赖注入的使用
1.什么是pojo?什么是bean?
首先,在之前几篇Spring的介绍文章当中,自己都提到了一个名词叫做POJO类,但是在回顾Spring的注解的使用的时候,去形容java当中的对象还有一个名词是叫做Bean,那么究竟Pojo类和Bean之间有什么区别呢?本人特地为此进行了资料收集,总结如下:
什么是POJO类呢?所谓的POJO,即Plain old java object,翻译过来是纯净的java老式的对象,POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象,pojo一般是用于数据的临时传递,它只能装载数据, 作为数据存储的载体,而不具有业务逻辑处理的能力,常常在dao层的实现的时候需要POJO类。
而什么是JAVAbean呢?所谓的JAVAbean是一种JAVA语言写成的可重用组件。它的方法命名,构造及行为必须符合特定的约定:
- 这个类必须有一个公共的缺省构造函数。
- 这个类的属性使用getter和setter来访问,其他方法遵从标准命名规范。
- 这个类应是可序列化的。
package bjtu.wellhold.testSpring; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class testUnit { public static void main(String[] args) { ApplicationContext cfg = new ClassPathXmlApplicationContext("Config.xml");
Person person = cfg.getBean("person", Person.class);
System.out.println(person); }
}
从代码看出,通过ApplicationContext的实例cfg当中的getBean方法,从Spring容器当中获取到了Person类的实例person(之前已经在配置文件当中配置好person,如有不会,请翻看之前的文章)之后再对获取到的person实例进行其他的逻辑操作。这是我们之前使用的基于配置文件的情况下的对象依赖注入的方式,可以看到这种方式还是比较繁琐的,因为要获取到Spring容器当中的实例之前,我们首先要获取到Spring上下文的实例,才能通过getBean的方法去获取到IOC容器当中的实例,在一点在Spring3.0之后,提出了一种更为简便,更为优雅的方式去实现了包括将pojo或bean类注册到Spring的容器当中,或者从Spring容器当中去获取到相应的实例的方式,那就是通过注解的形式。
首先回顾Spring的使用过程,我们第一步要先了解通过注解的形式,如何将我们所编写的Pojo类或者JAVAbean注册到Spring当中让其去管理,这时候我们使用的注解是@Component,通过这个注解可以讲所定义的JAVAbean或POJO类注册到Spring容器当中,并且根据所涉及的JAVAbean所处的层不同,还可以将@Component特化成一下几个注解:@Repository,用于DAO层,通常用于标记pojo类;@Service,用于业务逻辑层,通常用来标记JAVAbean,@Controller,用于控制表示层,通常也是用于标记JAVAbean的。使用方式也几乎一致,以下举一个@Repository的例子:
package bjtu.wellhold.testSpring; import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service; @Repository("person")
public class Person { private String name;
private int age; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
} }
在代码中,@Repository括号中的内容指的是将这个类交付与Spring容器之后,在Spring容器当中,这个类的实例的名称,以上注解等同于在配置文件当中编写:
<bean id="person" class="bjtu.wellhold.testSpring.Person"></bean>
在了解了如何将编写的POJO类和JAVAbean类注册到容器当中之后,我们再来看看如何从容器当中通过注解的方式去获取到这些类的实例,我们通过的是@Resource这个注解去进行。我们首先写一个PersonFactory类,通过注解的形式将Person的实例注入到PersonFactory当中:
package bjtu.wellhold.testSpring; import javax.annotation.Resource; import org.springframework.stereotype.Repository; @Repository("personFactory")
public class PersonFactory { @Resource(name="person",type=Person.class) private Person person; public Person createPerson()
{
System.out.println(person.toString());
return person;
} }
从代码可以看到。在被注入Person的实例的同时,PersonFactory也通过@Repository这个注解将自身托给了Spring容器去进行管理,之后我们来编写程序入口:
package bjtu.wellhold.testSpring; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component; public class testUnit { public static void main(String[] args) { ApplicationContext cfg = new ClassPathXmlApplicationContext("Config.xml");
Person person = cfg.getBean("person", Person.class);
PersonFactory personfactory = cfg.getBean("personFactory", PersonFactory.class);
personfactory.createPerson(); }
}
简单的解释一下,为什么我们不在程序入口这里就直接通过注解注入Person的实例呢?而需要中间通过一个PersonFactory去验证注入的效果?因为在程序的入口。main函数是一个静态的方法,如果需要在main函数中注入Person的实例,则Person实例需要定义成静态的,所谓的静态的,即是在类加载的时候就需要实例化的,但在类加载的时候,main函数没有被调用,并没有执行Spring的上下文,所以这时候注入的Person实例一定会报空指针错误,即在未加载Spring上下文之前,就已经执行了注入,所以不行,读者或者将来的自己可以好好思考一下这个前后顺序的问题,就可以明白其中的道理。
虽然是基于注解的方式去使用Spring,但是还是需要对配置文件进行一些简单的配置的,即要打开扫描和注解功能,配置文件如下:
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" /> <context:annotation-config /> <context:component-scan base-package="bjtu.wellhold.testSpring"/> </beans>
以上就是@Component注解以及它的分支的使用方法。
之后我们在来了解另一个注解@Configuration的使用方法,顾名思义,是可以通过java类为提供Spring容器提供Bean定义的信息了,常常与@Bean注解进行使用,每个标注了@Bean的类方法都相当于提供了一个Bean的定义信息。为了验证@Configuration,我们做两个pojo类,一个名叫Person,一个名叫Mechine,并且将这两个类注入到名叫Factory类当中,Factory类可以提供一个公共的方法打印这两个类的实例的信息。代码如下:
package bjtu.wellhold.testSpring; import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service; public class Person { private String name;
private int age; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
package bjtu.wellhold.testSpring; public class Mechine { private int id;
private String name; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Mechine [id=" + id + ", name=" + name + "]";
} }
package bjtu.wellhold.testSpring; import javax.annotation.Resource; import org.springframework.stereotype.Repository; public class Factory { private Person person;
private Mechine mechine; public void returnPerson()
{
System.out.println(person);
} public void returnMechine()
{
System.out.println(mechine);
} public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public Mechine getMechine() {
return mechine;
}
public void setMechine(Mechine mechine) {
this.mechine = mechine;
} @Override
public String toString() {
return "Factory [person=" + person + ", mechine=" + mechine + "]";
} }
之后我们通过一个FactoryConfiguration的类,进行@Configuration注解之后,为Spring提供Bean的配置信息,代码如下:
package bjtu.wellhold.testSpring; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class FactoryConfiguration { @Bean
public Person person(){
return new Person();
} @Bean
public Mechine mechine()
{
Mechine mechine=new Mechine();
mechine.setId(10);
mechine.setName("wellhold");
return mechine;
} @Bean
public Factory factory()
{
Factory factory=new Factory();
factory.setMechine(mechine());
factory.setPerson(person());
return factory;
} }
其效果就如同在配置文件当中写下如下内容
<bean id="person" class="bjtu.wellhold.testSpring.Person"></bean>
<bean id="mechine" class="bjtu.wellhold.testSpring.Mechine">
<property name="id" value="10"/>
<property name="name" value="wellhold"/>
</bean>
<bean id="factory" class="bjtu.wellhold.testSpring.Factory">
<property name="person" ref="person"/>
<property name="mechine" ref="mechine"/>
</bean>
最后我们来看看我们的程序入口:
package bjtu.wellhold.testSpring; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component; public class testUnit { public static void main(String[] args) { ApplicationContext cfg = new ClassPathXmlApplicationContext("Config.xml");
Factory factory = cfg.getBean("factory", Factory.class);
factory.returnMechine();
factory.returnPerson();
}
}
到此,目前笔者了解到的Spring框架当中用到的常用的注解就讲解完毕了。如有在看到新的注解内容,可能会继续更新此贴。
Spring:基于注解的依赖注入的使用的更多相关文章
- 07 Spring框架 依赖注入(四)基于注解的依赖注入
前面几节我们都在使用xml进行依赖的注入,但是在实际的开发中我们往往偏爱于使用注解进行依赖注入,因为这样更符合我们人的思维,并且更加快捷,本节就来讲述Spring基于注解的依赖注入: 信息注入注解 @ ...
- SSM-Spring-07:Spring基于注解的di注入
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 注解: 说起注解,哇哦,每个人都或多或少的用到过 像什么@Overried,@Test,@Param等等之前就 ...
- spring4——IOC之基于注解的依赖注入(DI )
spring容器对于Bean的创建和对象属性的依赖注入提供了注解的支持,让我们在开发中能够更加便捷的实现对象的创建和对象属性的依赖注入.一,对于Bean的创建spring容器提供了以下四个注解的支持: ...
- spring通过注解方式依赖注入原理 (私有成员属性如何注入)
一.spring如何创建依赖的对象 用过spring的都知道我们在dao.service层加上@repository.@Service就能将这两个对象交给spring管理,在下次使用的时候使用@res ...
- Java开发学习(十二)----基于注解开发依赖注入
Spring为了使用注解简化开发,并没有提供构造函数注入.setter注入对应的注解,只提供了自动装配的注解实现. 1.环境准备 首先准备环境: 创建一个Maven项目 pom.xml添加Spring ...
- Spring基于构造函数的依赖注入(DI)
以下内容引用自http://wiki.jikexueyuan.com/project/spring/dependency-injection/spring-constructor-based-depe ...
- Spring 基于构造函数的依赖注入
基于构造函数依赖注入 sprig通过bean创建对象时,会通过bean提供的参数来选择调用某个构造函数.上例中, <constructor-arg ref="spellChecker& ...
- spring下应用@Resource, @Autowired 和 @Inject注解进行依赖注入的差异
为了探寻 '@Resource', '@Autowired', 和'@Inject'如何解决依赖注入中的问题,我创建了一个"Party"接口,和它的两个实现类"Perso ...
- Spring 基于注解零配置开发
本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址:< Spring 基于注解零配置开发 > 一:搜索Bean 再也不用在XML文件里写什么配置信息了. Sprin ...
随机推荐
- Python执行Linux系统命令的4种方法
http://www.jb51.net/article/56490.htm (1) os.system 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 复制代码代码如下: system( ...
- Github & DMCA Takedown Policy
Github & DMCA Takedown Policy Digital Millennium Copyright Act 数字千年版权法案 https://help.github.com/ ...
- 51nod 1851俄罗斯方块(trick)
题目大意:给出一个黑白图,你可以选定一个俄罗斯方块的区域,黑白翻转,问能否变成白图 比较trick的题目, 首先可以想到,奇数个1肯定是无解的,所以考虑偶数个1 可以先讨论n是2的情况 当n为2时,其 ...
- ARC074 E RGB Sequence DP
---题面--- 题解: 首先,有一个不太直观的状态,f[i][j][k][l]表示DP到i位,三种颜色最后出现的位置分别是j, k, l的方案数.因为知道了三种颜色最后出现的位置,因此也可以得知以当 ...
- 安徽师大附中%你赛day3T1 怜香惜玉 解题报告
怜香惜玉 题意: 已知 \(f(x)=\frac{2 \times \sum_{(i,x)=1}^x i}{φ(x)}\) 先给定数据组数\(t\)和\(k\) 每组数据给出\(n\),求\(\sum ...
- NOIP2012 洛谷P1084 疫情控制
Description: H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情 ...
- 【BZOJ 1592】[Usaco2008 Feb]Making the Grade 路面修整 dp优化之转移变状态
我们感性可证离散(不离散没法做),于是我们就有了状态转移的思路(我们只考虑单不减另一个同理),f[i][j]到了第i块高度为j的最小话费,于是我们就可以发现f[i][j]=Min(f[i-1][k]) ...
- python3初识selenium
第一步:安装与配置 1.电脑上需要有火狐浏览器(默认安装在C:\Program Files (x86)\Mozilla Firefox目录下). 2.使用pip install selenium安装好 ...
- Codeforces Round #525 (Div. 2) F. Ehab and a weird weight formula
F. Ehab and a weird weight formula 题目链接:https://codeforces.com/contest/1088/problem/F 题意: 给出一颗点有权值的树 ...
- 开发中常遇到的Python陷阱和注意点
最近使用Python的过程中遇到了一些坑,例如用datetime.datetime.now()这个可变对象作为函数的默认参数,模块循环依赖等等. 在此记录一下,方便以后查询和补充. 避免可变对象作为默 ...