构造注入

如何给构造方法中的参数注入方法呢如下

首先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的更多相关文章

  1. IOC和AOP使用扩展 多种方式实现依赖注入

    多种方式实现依赖注入 1.Spring 使用setter访问器实现对属性的赋值, 2.Spring 构造constructor方法赋值, 3.接口注入 4.Spring P命名空间注入直接量 sett ...

  2. Spring多种方式实现依赖注入

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...

  3. Ioc和Aop扩展--多种方式实现依赖注入(构造注入,p命名空间注入,集合类型注入,注入null和注入空值)

    构造注入 语法: <constructor-arg>    <ref bean="bean的id"/> </constructor-arg> 1 ...

  4. Spring——多种方式实现依赖注入

    在Spring的XML配置中,只有一种声明bean的方式:使用<bean>元素并指定class属性.Spring会从这里获取必要的信息来创建bean. 但是,在XML中声明DI时,会有多种 ...

  5. 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 ...

  6. SSM框架之Spring(3)IOC及依赖注入(基于注解的实现)

    Spring(3)IOC及依赖注入(基于注解的实现) 学习基于注解的 IoC 配置,大家脑海里首先得有一个认知,即注解配置和 xml 配置要实现的功能都是一样 的,都是要降低程序间的耦合.只是配置的形 ...

  7. Spring Boot2(007):关于Spring beans、依赖注入 和 @SpringBootApplication 注解

    一.关于Spring beans 和 依赖注入(Dependency Injection) spring boot 和 Spring 全家桶无缝衔接,开发过程中可以很轻松地使用 Spring 全家桶的 ...

  8. 框架源码系列九:依赖注入DI、三种Bean配置方式的注册和实例化过程

    一.依赖注入DI 学习目标1)搞清楚构造参数依赖注入的过程及类2)搞清楚注解方式的属性依赖注入在哪里完成的.学习思路1)思考我们手写时是如何做的2)读 spring 源码对比看它的实现3)Spring ...

  9. Spring_02 注入类型值、利用引用注入类型值、spring表达式、与类相关的注解、与依赖注入相关的注解、注解扫描

    注意:注入基本类型值在本质上就是依赖注入,而且是利用的set方式进行的依赖注入 1 注入基本类型的值 <property name="基本类型的成员变量名" value=&q ...

随机推荐

  1. 09-----JS事件流的概念(重点)

    在学习jQuery的事件之前,大家必须要对JS的事件有所了解.看下文 时间的概念 HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件.页面的滚动事件onscroll等等,可以 ...

  2. Practice encryptedblobstore

    C++ BlobStore 使用范例(C++伪代码) 一个可能的接口设计示例(C++) Java BlobStore 使用范例(Java伪代码) 一个可能的接口设计示例(Java) 一个基于Key/V ...

  3. 大数据“重磅炸弹”——实时计算框架 Flink

    Flink 学习 项目地址:https://github.com/zhisheng17/flink-learning/ 博客:http://www.54tianzhisheng.cn/tags/Fli ...

  4. 为什么有人会觉得IT门槛低,工资高?

    今天在高铁上,翻着逼乎,被一个话题勾住了,"为什么很多人会觉得IT门槛低?" 我一惊,还真是,身边朋友都觉得"IT赚的多","程序员工资高" ...

  5. LitePal——安卓数据库library

    简介:一个让开发者使用SQLite数据库更加容易的库文件 LitePal for Android,项目地址:点击打开 LitePal是一个开源的android库,它让开发者使用SQLite数据变得容易 ...

  6. Visual Studio Code的快捷键和相关技巧

    编辑相关的键盘快捷键: Shift + Alt + F = 格式化代码(似乎不好用) Ctrl + Shift + Enter = 在上一行新建空行并转到上一行 Ctrl + K,Ctrl + C = ...

  7. Vue-mixins选项

    Vue-mixins选项 Mixins用于: 1.已经写好了构造器,还要增加方法或者临时的活动时使用的方法,用混入能减少源代码的污染. 2.公用方法,用混入的方法可以减少代码量,实现代码重用.(使用全 ...

  8. 在 Visual Studio 或 SQLServer Management Studio 的代码编辑器中使用正则表达式匹配日期格式

    使用正则查找时间格式文本 VS正则: (:z表示数字) ':z-:z-:z :z[\:]:z[\:]:z'

  9. Windows 服务快捷启动命令,可以直接在运行处运行电脑的功能。

    gpedit.msc-----组策略 sndrec32-----录音机 nslookup----- ip地址侦测器 explorer------ 打开资源管理器 logoff-------注销命令 t ...

  10. git版本管理工具 标签(Tag) / 版本回退 / 分支的简单使用

    a.标签 标签,可以使用这个功能来标记发布结点. 举个例子, 假如我们的项目版本目前是1.2版本, 上级要求这个版本要在半个月后再进行上传至Appstore, 并要求我们未来的半个月内,去写1.3版本 ...