多种方式实现依赖注入及使用注解定义bean
构造注入
如何给构造方法中的参数注入方法呢如下
首先bean代码如下
package cn.pojo;
public class Greeting {
/**
* 说的话
*/
private String words;
/**
* 说话的人
*/
private String person;
private Greeting greeting;
public void sayGreeting() {
System.out.println(person+"说:"+words);
}
public Greeting getGreeting() {
return greeting;
}
public void setGreeting(Greeting greeting) {
this.greeting = greeting;
}
public Greeting() {
// TODO Auto-generated constructor stub
}
public Greeting(String words1,String person1) {
this.words=words1;
this.person=person1;
}
public String getWords() {
return words;
}
public void setWords(String words) {
this.words = words;
}
public String getPerson() {
return person;
}
public void setPerson(String person) {
this.person = person;
}
}
xml注入代码如下
<!-- id为实例后对象名 class为对象的类型 -->
<bean id="greeting1" class="cn.pojo.Greeting">
<!--name为构造参数中的参数名称 value为值 -->
<constructor-arg value="三天不打鬼子,手都不自在" name="words1"/>
<constructor-arg value="小兵张嘎" name="person1"/>
</bean>
这段个代码跟下面这段Java代码的意思是一样的,实例化一个名叫 greeting1的对象并且传入两个参数 ,name则对应参数的名称
Greeting greeting1 = new Greeting("三天不打鬼子,手都不自在","小兵张嘎");
测试代码如下
//找到配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Greeting greeting1 = (Greeting)context.getBean("greeting1");
greeting1.sayGreeting();
结果如下

注入属性
注入代码如下
<bean id="greeting1" class="cn.pojo.Greeting">
<!--name为构造参数中的参数名称 value为值 -->
<constructor-arg value="三天不打鬼子,手都不自在" name="words1"/>
<constructor-arg value="小兵张嘎" name="person1"/>
<!-- 此段代码相当于 实例化Greeting类后调用set方法对属性名为greeting的属性进行赋值,只不过赋值的类型是自定义的类类型-->
<property name="greeting" ref="greeting2"/>
</bean>
<bean id="greeting2" class="cn.pojo.Greeting">
<!--name为构造参数中的参数名称 value为值 给Greeting中的words和person赋值,相当于调用set方法进行赋值-->
<property name="words" value="世界上有十种人,认识二进制和不认识二进制的"/>
<property name="person" value="Rod"/>
</bean>
再编写bean时需要注意些setget方法,否则注入时将会出现异常
测试类代码
//找到配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Greeting greeting1 = (Greeting)context.getBean("greeting1");
greeting1.getGreeting().sayGreeting();
greeting1.sayGreeting();
运行结果

p命名空间注入
首先使用p需要导入 xmlns:p="http://www.springframework.org/schema/p" 才能使用 这个地址访问会出404不用管 是正常的可以用。注意区分大小写
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd ">
p命名空间简化了属性的注入,简化了配置的方法,大大的简化了配置的工作量 如下
<!-- 对类类型的属性进行赋值分号后为 属性名加-ref 即 greeting-ref-->
<bean id="greeting1" class="cn.pojo.Greeting" p:greeting-ref="greeting2">
<!--name为构造参数中的参数名称 value为值 -->
<constructor-arg value="三天不打鬼子,手都不自在" name="words1"/>
<constructor-arg value="小兵张嘎" name="person1"/>
</bean>
<!-- 分号后面为 属性名称 -->
<bean id="greeting2" class="cn.pojo.Greeting"
p:words="世界上有十种人,认识二进制和不认识二进制的" p:person="Rod"/>
使用注解定义bean
注意:如果是jdk1.8的最好不要用spring3,或者使用jdk1.7。否则很可能会出现不兼容,之前我就亲身经历了这个问题。于是我就换成了spring 4
jar下载网址:http://repo.spring.io/release/org/springframework/spring/
使用注解定义bean又进一步的减少了配置文件的代码量
首先定义一个接口然后仔定义实现类
//通过注解定义了一个dao,此注解相当于 实例化了一个名叫 userDao UserDaoImppl类型的对象,是跟在xml中定义了一个bean一样的效果
@Component("userDao")
public class UserDaoImpl implements UserDao { @Override
public void save(User u) {
System.out.println("保存用户信息到数据库!");
} }
编写业务层
//此注解相当于实例化了名为 userService的对象,也是跟xml定义了一个bean一样的效果
@Service("userService")
public class UserServiceImpl implements UserService{
//查找名为userDao的bean,并注入给dao属性
@Resource(name="userDao")
private UserDao dao;
public UserDao getDao() {
return dao;
}
public void setDao(UserDao userDao) {
this.dao = userDao;
}
@Override
public void save(User u) {
// TODO Auto-generated method stub
dao.save(u);
} }
或者这样也是可以的
//此注解相当于实例化了名为 userService的对象
@Service("userService")
public class UserServiceImpl implements UserService{
//查找名为dao的bean,并注入给dao属性
@Autowired
@Qualifier("userDao")
private UserDao dao;
public UserDao getDao() {
return dao;
}
public void setDao(UserDao userDao) {
this.dao = userDao;
}
}
或者这样
@Autowired
private UserDao dao;
亦或者这样
@Resource
private UserDao dao;
上述的几种方式结果都是一样的 @Resource和@Autowired默认会寻找符合条件的bean 而 @Component("userDao")正好满足。而他们的赋值是跟setget没有关系的即使去掉也
没得事
userConfig代码如下
<?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-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd ">
<!-- 扫描指定目录下的所有文件 可以直接写 所有包的“父亲”cn也可以 -->
<context:component-scan base-package="cn.dao.impl,cn.service.impl"/>
</beans>
测试类代码如下
ApplicationContext context = new ClassPathXmlApplicationContext("userConfig.xml");
UserService userDao = (UserServiceImpl)context.getBean("userService");
User u = new User();
userDao.save(u);
结果如下

- @Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。
- @Repository:用于标注Dao类
- @Service:用于标注业务类
- @Controller:用于标注控制权类
它们的作用都是定义一个bean,看到不同的注解的时候可以方便区分此bean时干嘛用的。
多种方式实现依赖注入及使用注解定义bean的更多相关文章
- IOC和AOP使用扩展 多种方式实现依赖注入
多种方式实现依赖注入 1.Spring 使用setter访问器实现对属性的赋值, 2.Spring 构造constructor方法赋值, 3.接口注入 4.Spring P命名空间注入直接量 sett ...
- Spring多种方式实现依赖注入
平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...
- Ioc和Aop扩展--多种方式实现依赖注入(构造注入,p命名空间注入,集合类型注入,注入null和注入空值)
构造注入 语法: <constructor-arg> <ref bean="bean的id"/> </constructor-arg> 1 ...
- Spring——多种方式实现依赖注入
在Spring的XML配置中,只有一种声明bean的方式:使用<bean>元素并指定class属性.Spring会从这里获取必要的信息来创建bean. 但是,在XML中声明DI时,会有多种 ...
- ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
ExpandoObject与DynamicObject的使用 using ImpromptuInterface; using System; using System.Dynamic; names ...
- SSM框架之Spring(3)IOC及依赖注入(基于注解的实现)
Spring(3)IOC及依赖注入(基于注解的实现) 学习基于注解的 IoC 配置,大家脑海里首先得有一个认知,即注解配置和 xml 配置要实现的功能都是一样 的,都是要降低程序间的耦合.只是配置的形 ...
- Spring Boot2(007):关于Spring beans、依赖注入 和 @SpringBootApplication 注解
一.关于Spring beans 和 依赖注入(Dependency Injection) spring boot 和 Spring 全家桶无缝衔接,开发过程中可以很轻松地使用 Spring 全家桶的 ...
- 框架源码系列九:依赖注入DI、三种Bean配置方式的注册和实例化过程
一.依赖注入DI 学习目标1)搞清楚构造参数依赖注入的过程及类2)搞清楚注解方式的属性依赖注入在哪里完成的.学习思路1)思考我们手写时是如何做的2)读 spring 源码对比看它的实现3)Spring ...
- Spring_02 注入类型值、利用引用注入类型值、spring表达式、与类相关的注解、与依赖注入相关的注解、注解扫描
注意:注入基本类型值在本质上就是依赖注入,而且是利用的set方式进行的依赖注入 1 注入基本类型的值 <property name="基本类型的成员变量名" value=&q ...
随机推荐
- Notepad++代码函数快速提示设置
设置——首选项——自动完成
- .net 向新页面跳转的语句
1. href='##' onclick=\"window.open('../DataSplit/DrugInfo_ManualVersionViewNew.aspx?id=" + ...
- Response.Redirect 打开新窗口的两种方法
一般情况下,Response.Redirect 方法是在服务器端进行转向,因此,除非使用 Response.Write("<script>window.location='htt ...
- Day1下午
T1 暴力50分 排A和B X,不用考虑X 用数组80分, 权值线段树.平衡树100, 一个函数? T2 打表 dp logn+1,+ 搜索,dp? txt..... T3 30分暴力和尽量均 ...
- flask --db-Column属性
db.Column 中其余的参数指定属性的配置选项. 选项名 说 明 primary_key 如果设为 True,这列就是表的主键 unique 如果设为 True,这列不允许出现重复的值 index ...
- java反射-使用反射获取类的所有信息
在OOP(面向对象)语言中,最重要的一个概念就是:万事万物皆对象. 在java中,类也是一个对象,是java.lang.Class的实例对象,官网称该对象为类的类类型. Class 类的实例表示正在运 ...
- JAVA4大线程池
不知不觉中我们电脑的硬件设施越来越好,从双核四线程普及到如今四核八线比比皆是.互联网发展至今,讲究的就是快,less is more,而且大数据的诞生和各种种类繁多的需求处理,单线程的程序逐渐不能满足 ...
- pm2部署node应用
背景: 很早就知道了pm2的强大功能,部署,多进程部署,负载均衡等等,但是一直没有取尝试使用,每次写完代码就没关心部署的事了.最近有空就想着把pm2的部署流程走一遍,顺便整理出来. 环境: 1.本地: ...
- SpringBoot JUnit4的断言和注解
Junit4的断言常用方法: assertArrayEquals( new Object[]{ studentService.likeName("小明2").size() > ...
- SpringBoot的特性
SpringBoot的理念“习惯优于配置” 习惯优于配置(项目中存在大量的配置,此外还内置了一个习惯性的配置,无须手动进行配置) 使用SpringBoot可以方便地创建独立运行.准生产级别的基于Spr ...