Spring基础入门之IoC注入

我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由多个对象组成的,所有的对象通过彼此之间的合作,最终实现系统的业务逻辑,为了解决对象之间的耦合度过高的问题,Spring的IOC理论,用来实现对象之间的“解耦”.IOC的中文意思就是“控制反转”,通俗的理解成权利反转,本来对象的创建由程序员自己写new的代码,new出一个类的对象,在调用它的方法,当代码项目一多起来,就暴露了一个问题:要new的类越多越不好管理。于是Spring的IoC就是把创建对象的事情放在Spring容器里面;就是把东西甩给了容器做,而不再是程序员一个一个new .

Spring的依赖注入可以用手工装配或自动装配.

下面先介绍经常使用的手动装配方式

手动装配方式主要有三种:(1)set方法注入(2)构造方法注入(3)工厂方法注入  (Spring不支持接口注入)

1.Set注入方式,属性

通过无参构造函数set方法注入,这种方式必须提供一个set方法,否则会报异常

①先定义一个emp类;写上对一个的get set方法;

public emp{
private Integer id;

public emp(){}
set方法;
get方法;

}

②定义一个接口EmpService 和Empdao接口empservice是emp的service类,empdao是epm的数据库操作类;

public interface EmpService {
    void save(Object o);
    void delete(Integer id);}}

public interface EmpDao {
    void del(Integer id);
    void add();
}

③Empservice和EmpDao的实现类

public class EmpServiceImpl implements EmpService {
    private EmpDao dao;
    public EmpServiceImpl() {
    }
    public void save(Object o) {
            System.out.println("保存了员工");
    }
    public void delete(Integer id) {
        dao.del(id);
        System.out.println("删除了员工"+id);
    }
    public EmpServiceImpl(EmpDao dao) {
        super();
        this.dao = dao;
    }
    public EmpDao getDao() {
        return dao;
    }
    public void setDao(EmpDao dao) {
        this.dao = dao;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }
public class EmpDaoService implements EmpDao {

    public EmpDaoService() {
    }
    @Override
    public void del(Integer id) {
        System.out.println("删除了员工");
    }

④Xml文件配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="EmpServiceImplid" class="com.an.service.EmpServiceImpl" >
<property name="Dao" ref="EmpDaoServiceid" /></bean>
<bean id="EmpDaoServiceid" class="com.an.service.EmpDaoService" ></bean>
</beans>

<bean>中的id用来做标识,标志这哪一个类;

class是指需要创建的类的全名, <property>标签中的name就是EmpDaoService类中的Dao属性名,前提是EmpDaoService类必须去提供一个set方法让spring把值传进去,因为name的内容不是根据变量名(属性),是根据set方法生成的;ref指的是引用另一个bean,在这里就是指向下面的<bean id="EmpDaoServiceid"…/>

⑤编写测试类测试结果

public class EmpServiceTest {

    public EmpServiceTest() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String[] args) {

        //创建Spirng的工厂
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取Empservice
        EmpService serv=(EmpService) ac.getBean("EmpServiceImplid");
        //
        serv.delete(1);

    }

运行结果:

删除了员工

删除了员工1

set注入的缺点是无法清晰表达哪些属性是必须的,哪些是可选的,构造注入的优势是通过构造强制依赖关系,不可能实例化不完全的或无法使用的bean。

2.带参数的构造方法注入

这种方式的注入是指带有参数的构造函数注入,下面的例子,创建了两个成员变量id和name,但是并未设置对象的set方法,所以就不能支持第一种注入方式,这里的注入方式是在emp的构造函数中注入,也就是说在创建emp对象时要将id,namer两个参数值传进来。

①emp类的编写如下:

public class emp {
    private String name;
    private int id;
    public emp() {
        // TODO Auto-generated constructor stub
    }
    public emp(String name, int id) {
        super();
        this.name = name;
        this.id = id;
System.out.println("调用了构造方法 "+name+id);
    }

}

②xml的配置文件修改如下:

<bean class="com.an.service.emp" id="emp">
    <constructor-arg name="id" value="1101"></constructor-arg>
    <constructor-arg name="name" value="Anre"></constructor-arg>
</bean>

③测试类

public class testemp {
    public testemp() {
    }
    public static void main(String[] args) {
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        emp e=ac.getBean("emp",emp.class);
    }
}

④运行结果:

调用了构造方法 Anre1101

另外几种通过构造方法注入的方式构造注入特别是针对有些属性需要在对象在创建时候赋值,且后续不允许修改(不提供setter方法)

(1)根据索引(2)根据数据类型(3)直接赋值

(1) 根据索引注入根据索引赋值,索引都是以0开头的:

<constructor-arg index="0" value="1101 " />

<constructor-arg index="1" value="anso" />

(2)根据数据类型注入

这种方法基本上不怎么适用,以个类里可以有好几个相同基本类型的变量,很容易就混淆值传给哪一个参数了

<constructor-arg index=”Java.lang.Integer” value="1101 " />

<constructor-arg type=”Java.lang.String” value="anso" />

(3)直接赋值注入

通常不推荐使用直接给参数赋值,这种方法根据参数的顺序排,传入的参数位置不对,就会出现问题

<constructor-arg  value="1101" />

<constructor-arg  value="anso" />

通过Spring创建的对象默认是单例的,如果需要创建多实例对象可以在<bean>标签后面添加一个属性:

<bean name="..." class="..." scope="prototype">

在<bean>标签中,加上scope属性来控制对象在容器中的数量。
(1)scope = singlton (单例模式),对象在容器中全局唯一,在IOC容器初始化的时候该对象就会被创建
(2)scope = prototype (多例模式),在每一次调用getBean的时候IOC容器才会创建该对象的实体,并且每次创建都是不同的对象。

时间: 2024-10-09 18:48:13

Spring基础入门之IoC注入的相关文章

JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试

Spring框架学习路线 Spring的IOC Spring的AOP,AspectJ Spring的事务管理,三大框架的整合 Spring框架概述 什么是Spring? Spring是分层的JavaSE/EE full-stack(一站式)轻量级开源框架. 所谓分层: SUN提供的EE的三层结构:web层.业务层.数据访问层(也称持久层,集成层). Struts2是web层基于MVC设计模式框架. Hibernate是持久的一个ORM的框架. 所谓一站式:Spring框架有对三层的每层解决方案.

Spring基础知识之依赖注入

Spring框架的四大原则: 1)使用POJO进行轻量级和最小侵入式的开发. 2)通过依赖注入和基于接口编程实现松耦合. 3)通过AOP和默认习惯进行声明式编程. 4)使用AOP和模板(template)减少模式化代码. 1.1依赖注入: 控制反转(Inversion of Control - IOC)与依赖注入(dependency injection - DI)在Spring环境下是同等的概念. 控制反转是通过依赖注入实现的.所谓的控制反转指的是:容器负责创建对象和维护对象间的依赖关系. 依

Spring 基础入门(一)

本文代码部分来自于<spring in action> Spring 是为了解决什么 一个框架的存在是为了解决某个问题的,那么Spring这个框架是为了解决什么问题呢?主要就是解耦,spring主要要把握两方面的知识, DI(依赖注入 dependency injection) : 解耦, 方便测试 AOP(面向切面编程 aspect-oriented programming) DI (依赖注入 depency injection) 先看一个例子: 1 //定义一个勇士类 2 public c

Spring框架学习(二)IOC注入之set/get方法

action层需要调用service层对象,service层又需要调用dao层的对象.一般情况而言就直接newXXX()使用就可以了,但 是这种方法会使程序的耦合性太强.当Action类中需要更换service方法时,就需要改动源代码.Spring框架就用IOC注入的方法帮我们解决 了这个问题. 示例代码(模拟WEB环境下): applicationContext.xml: <?xml version="1.0" encoding="UTF-8"?> &

Spring基础 快速入门spring(1) 基础概念

作为流行了10年以上的老将,spring依然精神矍铄,影响不减.本文将对spring很基础的概念进行介绍以及为学习spring最核心和基础的知识作环境搭建的准备. Spring官网 http://docs.spring.io/ 简介 Spring为JAVA企业级应用提供了一个较为复杂框架流行框架.spring到底能做什么,或者说spring现在能做什么? 除了spring framework之外还有spring boot/spring data/spring cloud/- 快接近无所不包了.已

Spring入门 (IOC)

1.实现原理 IOC:控制反转,指的是对象创建权反转(交给)Spring,作用是实现了程序的解耦合. 2.实现步骤 (1)    下载jar包(参见开发库/spring) (2)    创建web项目,导入jar包 (3)    书写配置文件,并注册对象到容器中 Xml文件名字与位置任意,建议放到src目录下起名为aoolicationContext.xml Xml中注册对象: (4)测试代码 3.Spring创建对象的三种方式(Bean创建方式) (1)工厂类: (2)配置文件: (3)   

[Spring框架]Spring AOP基础入门总结一.

前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务

Spring 基础概念——DI、IOC

一.IOC 控制反转 package com.qunar.studyspring.bean; import com.qunar.studyspring.dao.PersonDao; import com.qunar.studyspring.object.Person; /** * 这是一个没有控制反转的例子 * @author liqiu * */ public class PersonServiceBean { private PersonDao personDao = new PersonD

Spring入门第一课:Spring基础与配置Bean

1.入门 Spring是简化java开发的一个框架,其中IoC和AOP是Spring的两个重要核心.由于Spring是非侵入性的,通过Ioc容器来管理bean的生命周期,还整合了许多其他的优秀框架,所以极大的简化了我们的开发过程.Spring的核心包括Beans.Core.Context.SpEL.对应的包的文件名形式为spring-expression-4.0.0.RELEASE.jar这样的形式.在进行Spring开发时,我们必须引入这四个核心包和一个日志包,导入Referenced Lib