多种方式实现依赖注入及使用注解定义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 ...
随机推荐
- 一个简单的类似Vue的双向绑定
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 切换本地凭据(Windows上登录的GitHub账号)
切换本地用户,可以向微软小娜搜索Windows凭据,这个步骤可以参考这篇博客 的说明.
- 两个线程分别打印 1- 100,A 打印偶数, B打印奇数
package com.demo.thread; public class PrintNumber { private static Object lock = new Object(); priva ...
- css 设置table样式
<style type="text/css" > table tr td{height:39px; font-size: 13px; line-height: ...
- 【开源我写的富文本】打造全网最劲富文本技术选型之经典OOP仍是魅力硬核。
套路--先贴图 demo : http://www.vvui.net/editor/index.html gitee : https://gitee.com/kevin-huang/Bui-Edit ...
- Http报文长度的计算
客户机与服务器需要某种方式来标示一个报文在哪里结束和在下一个报文在哪里开始. 一般使用Content-Length表示body报文体的长度,这样往后截取即可获得整个报文.对于普通的页面.图片皆可使用. ...
- ThinkPHP- 3.1
基础: 1. 基础概念 LAMP LAMP是基于Linux,Apache,MySQL和PHP的开放资源网络开发平台.这个术语来自欧洲,在那里这些程序常用来作为一种标准开发环境.名字来源于每个程序的第一 ...
- 自定义HashMap的键
用自定义的类型作为HashMap的key,必须同时重载hashCode()和equals(),才可以实现在HashMap中的查找自定义键. 例如自定义Point类: public class Poin ...
- bootstrapValidator 重置表单
最近在公司做业务系统后台,用的js框架还是jquery ui框架 是以bootstrap为基础的beyondadmin-v1.4.s3这套,用起来还挺不错,所以公司所有的后台ui都使用这套.这套ui ...
- URL最大长度问题
在http协议中,其实并没有对url长度作出限制,往往url的最大长度和用户浏览器和Web服务器有关,不一样的浏览器,能接受的最大长度往往是不一样的,当然,不一样的Web服务器能够处理的最大长度的UR ...