Spring的核心之IOC

这几天因为要面试java实习,了解到大部分公司对实习生的三大框架的掌握程度很重视,而之前上课时老师又没讲到三大框架,所以一直在自学,今天就简单记录一下,有误的地方,望各位指点。
IOC(Inversion of Control) 即控制反转,又名依赖注入(DI,Dependency Injection) 。IOC使程序组件之间或类之间尽量形成一种松耦合的结构,对于之前的程序开发,我们在使用一个类的实例之前需要先new出这个类的实例,而IOC会将创建实例的任务交给IOC容器,这样我们就只要直接使用这个实例就好。IOC容器创建实例的过程为:从配置文件中读取JavaBean的定义信息—–>根据定义信息去创建JavaBean的实例对象—–>注入其依赖的属性。简单这样说好像不易于理解,下面通过简单的配置文件讲解一下:

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    **<bean id="person" class="bean.Person">
        <property name="name" value="ZHJ"/>
        <property name="age" value="24"/>
    </bean>**
</beans>

这里主要看一下加粗的部分,bean是配置文件中的beans元素中的一个子元素,IOC容器会根据bean中的class属性对应的类名来确定实例化哪个类,property里是注入的属性,最后会放上具体代码的,方便理解。
另外说明一下,bean只是Spring容器初始化、装配及被管理的对象,Spring IOC容器管理一个或多个bean。
IOC有三种实现类型,分别是:接口注入,Setter注入,构造器注入。下面会放上三种类型的具体代码:
先放上Spring包地址:http://pan.baidu.com/s/1sjDbzrR
1.接口注入,基于接口将调用与实现分离,Spring不支持这种IOC方式,因为这种方式必修实现接口中的方法,具有入侵性。
2,Setter注入,基于JavaBean的Setter方法为属性赋值,接下来看具体代码:
(1)先创建一个Bean.xml文件,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="person" class="cn.zafu.bean.Person">
        <property name="name" value="ZHJ"/>
        <property name="age" value="24"/>
    </bean>
</beans>

(2)接下来在包cn.zafu.bean下创建待实例化的类Person

package cn.zafu.bean;
public class Person {

    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void info(){
        System.out.println("Setter注入,name="+getName()+",age="+getAge());
    }
}

(3)创建要调用Person的类test

package cn.zafu.bean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.zafu.bean.Person;

public class test {
    public static void main(String[] args){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");//从classpath路径上装载xml的配置信息
        Person p = ctx.getBean("person",Person.class);//创建bean的引用对象
        p.info();
    }
}

(4)运行结果为:

Setter注入,name=ZHJ,age=24

3.构造器注入,基于类的构造方法为属性赋值,代码如下:
(1)创建想要被实例化的类Person

package cn.zafu.GouZaoQi;
public class Person {
    private String name;
    private int age;
    public Person(String name,int age)
    {
        this.name = name;
        this.age = age;
    }
    public void printInfo()
    {
        System.out.println("构造器实现依赖注入:name = "+name+",age = "+age);
    }
}

(2)在src下创建配置文件GZQBean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="person" class="cn.zafu.GouZaoQi.Person">
        <!-- 通过多个constructor-arg标签完成对构造函数的传参,index属性用于指定构造方法的参数索引 -->
        <constructor-arg index = "0" value="ZHJ"/>
        <constructor-arg  index = "1"  value="24"/>
    </bean>
</beans>

(3)测试类Main

package cn.zafu.GouZaoQi;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
    public static void main(String[] args) {
        //装载配置文件
        ApplicationContext ctx = new ClassPathXmlApplicationContext("GZQBean.xml");
        //获取配置信息,对相应的类实例化
        Person p = (Person)ctx.getBean("person");
        p.printInfo();
    }
}

(4)运行结果为:

构造器实现依赖注入:name = ZHJ,age = 24

以上就是Setter注入和构造器注入的简单例子,另外在Spring中还可以通过配置文件使用元素引用其他JavaBean的实例对象,例如将Person注入到另一个类Manager中,然后通过Manager输出Person的信息,代码如下:
(1)Person类和构造器中的一样,这里不再重复,Manager类如下:

package cn.zafu.GouZaoQi;
public class Manager {
    private Person person;
    private int num;

    public Person getPerson() {
        return person;
    }
    public void setPerson(Person person) {
        this.person = person;
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public void Info()
    {
        person.printInfo();
        System.out.println(",num = "+num);
    }
}

(2)配置文件GZQBean.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    <!--class标签指定待实例化的类的路径-->
    <bean id="person" class="cn.zafu.GouZaoQi.Person">
        <!-- 通过多个constructor-arg标签完成对构造函数的传参,index属性用于指定构造方法的参数索引 -->
        <constructor-arg index = "0" value="ZHJ"/>
        <constructor-arg  index = "1"  value="24"/>
    </bean>
    <!--class标签指定待实例化的类的路径-->
     <bean id="manager" class="cn.zafu.GouZaoQi.Manager">
        <property name="num"  value="5"/>
        <!--表示引用bean的名称为person所对应的类的实例对象-->
        <property name = "person"  ref ="person"/>
    </bean>
</beans>

(3)测试类Main如下:

package cn.zafu.GouZaoQi;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

    public static void main(String[] args) {
        //装载配置文件
        ApplicationContext ctx = new ClassPathXmlApplicationContext("GZQBean.xml");
        //获取配置信息,对相应的类实例化
        Manager manager = (Manager)ctx.getBean("manager");
        manager.Info();
    }

}

(4)运行结果如下:

构造器实现依赖注入:name = ZHJ,age = 24,num = 5

关于IOC细节知识还有很多,以后会陆续有补充,今天暂时先写到这里,如果上述有什么问题,还望请大牛们给与指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值