构造注入

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

首先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. Hello ASP.NET on Docker -- CentOS

    1.docker pull microsoft/aspnet 2.docker run -p 5004:2015 microsoft/aspnet --穿越后 3.cd ~ && wg ...

  2. Storm概念学习系列之Task任务

    不多说,直接上干货! 每一个Spout/Bolt的线程称为一个Task. Task任务 Task是运行Spout或Bolt的单元,每一个Spout/Bolt的线程称为一个Task. 在Storm 0. ...

  3. Dede友情链接和分页列表和内容分页去掉小圆点LI标签

    我用了一个比较老式的模板,友情链接和列表页底下的一段分页导航会自动获取LI标签,导致错位.每段文字前还多出一个可恶的黑色实心小圆点,心想肯定是LI标签在搞怪,于是把模板文件和样式文件都翻看了一个底朝天 ...

  4. JAVA 集合类小结

    一 集合和数组 因为本人也是个go的爱好者,所以对于集合类算是摸的比较透的. 说到集合,必须了解数组和集合. Java的数组长度固定,集合长度不定.集合是特定的数据结构的集合. 而go里面并没有集合, ...

  5. ADODB.Stream在进行文件上传时报错

    最近在做web项目,有个控件是上传材料文件和文件夹,本地运行正常,放到服务器上,一直报错:AutoRuntime服务器无法创建..... 解决方法: 1.配置ie浏览器的安全级别 2.修改ie浏览器对 ...

  6. Laravel项目的结构文章

    http://esbenp.github.io/2016/04/11/modern-rest-api-laravel-part-1/

  7. JavaSE之Java基础(5)

    21.简述正则表达式及其用途. 在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码. 22.Java ...

  8. spring-boot整合shiro作权限认证

    spring-shiro属于轻量级权限框架,即使spring-security更新换代,市场上大多数企业还是选择shiro 废话不多说  引入pom文件 <!--shiro集成spring--& ...

  9. hibernate课程 初探单表映射3-1 hibernate单表操作简介

    本章简介: 1 单一主键 2 基本类型 3 对象类型 4 组件属性 5 单表操作CRUD实例

  10. 给 Magento 2 添加缓存层的分析与尝试

    虽然黑色星期五有惊无险的过去了, 但是 Magento 2 社区版无法读写分离这个限制, 始终是悬在整个网站上的一把利剑. 我之前尝试过给 Magento 2 写一个 MySQL 读写分离的插件, 在 ...