Spring IoC 详解(上篇)

介绍:
Spring 主要思想IoC(控制反转) 是Core的核心部分,AOP(面向切面编程),其中IoC由DI(依赖注入)的思想实现,AOP是OOP(面向对象)的一种延伸,Spring可以降低程序组建之间的耦合度。

Spring 提供了Spring MVC(spring web mvc) 的实现,可以快速开发MVC结构的Web程序

Spring核心jar包:
IoC:
commons-logging.jar
spring-beans-*.RELEASE.jar
spring-context-*.RELEASE.jar
spring-core-*.RELEASE.jar
spring-expression-*.RELEASE.jar
AOP:
aopalliance.jar
aspectjweaver.jar
spring-aop-*.RELEASE.jar
spring-aspects-*.RELEASE.jar
MVC:
jstl.jar
spring-web-*.RELEASE.jar
spring-webmvc-*.RELEASE.jar
standard.jar

spring的容器类型分为:ApplicationContext(主流)和BeanFactory(一般不用)

实例化ApplicationContext容器:

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

applicationContext.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"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
    <!-- Bean 初始化部分 -->
    <!-- 声明组件new构造器实例化bean -->
    <bean id="exampleNew" class="action.ExampleAction"></bean>
    <!-- 通过实例工厂方法实例化bean,必须指定factory-method,指定由哪个方法创建,
         创建后得到的是该方法的结果,调用的方法必须有返回值! -->
    <bean id="exampleFactory" factory-bean="exampleNew" factory-method="execute"></bean>
    <!-- 声明组件静态方法实例化bean,factory-method可以为静态方法 -->
    <bean id="calendar" class="java.util.Calendar" factory-method="getInstance"></bean>
    <!-- 指定默认init方法和destory方法 -->
    <!-- 延迟实例化lazy-init="true" 推迟到getBean方法调用时初始化,通常用于使用频率较低的方法 -->
    <bean id="e1" class="action.ExampleAction" lazy-init="true" scope="singleton" init-method="init" destroy-method="destory"></bean>

</beans>

获取bean
Calendar c = ac.getBean(“calendar”,Calendar.class);
新版本语法参数1为bean的id,参数2为bean的类的类型
控制对象使用范围:
scope=”[singleton(单例)|prototype(原型)]”
singleton:默认方式,bean容器中只有一个对象,以单例模式获取对象,每次拿到的都是同一个对象。
注意:如果使用默认的模式,有可能出现线程同步问题
prototype:原型模式,每次拿到的都是新的对象
模拟获取bean对象:

@org.junit.Test
    public void test() {
        //创建ApplicationContext容器
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println(ac);
        Calendar c = ac.getBean("calendar",Calendar.class);
        System.out.println(c.getTime());
    }
<!-- 指定默认init方法和destory方法 -->
<!-- 延迟实例化lazy-init="true" 推迟到getBean方法调用时初始化,通常用于使用频率较低的方法 -->
<bean id="e1" class="action.ExampleAction" lazy-init="true" scope="singleton" init-method="init" destroy-method="destory"></bean>

init-method=”init”:在创建对象后,执行对应名字方法
destroy-method=”destory”:容器销毁后,执行对应名字方法,销毁方法仅对单例模式有效

模拟init,destory:

@org.junit.Test
    public void test1() {
        //AbstractApplicationContext容器,可以模拟销毁的过程
        AbstractApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        ExampleAction e1 = ac.getBean("e1",ExampleAction.class);
        e1.execute();
        ac.close();
    }

用于演示的 JAVA 类,ExampleAction.java

    public class ExampleAction {

        public ExampleAction() {
            System.out.println("正在实例化......");
        }

        /**
         * 模拟初始化方法
         */
        public void init() {
            System.out.println("init正在初始化......");
        }
        /**
         * 模拟执行的方法
         */
        public String execute() {
            System.out.println(this.getClass().getName()+"正在执行.....");
            return "success";
        }

        /**
         * 模拟销毁时的方法
         */

        public void destory() {
            System.out.println("destory正在销毁......");
        }
    }

IoC: 控制反转/反向控制
本质:改变了对象获取方式,由原有自己创建应用,转为接收外界(第三方,比如spring)注入的对象使用。
Spring的IoC主要采用DI(依赖注入)技术实现关系注入
Spring的DI又分为set注入,构造器注入

set注入可以注入:属性,bean,对象
模拟set注入,applicationContext.XML配置:

<!-- 声明Computer -->
<bean id="computer" class="model.Computer">
    <!-- 注入属性 -->
    <property name="mainbord" value="华硕"></property>
    <property name="hdd" value="西数"></property>
    <property name="ram" value="金泰克"></property>
</bean>

测试代码:

    @org.junit.Test
    public void test3() {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        Computer c = ac.getBean("computer",Computer.class);
        c.show();
    }

bean的对应JAVA类,Computer.java

/**
 * 模拟使用set方法注入信息
 * @author haifeng
 *
 */
public class Computer implements Serializable{

    private String mainbord; //主板
    private String hdd; //硬盘
    private String ram; //内存



    public void setMainbord(String mainbord) {
        this.mainbord = mainbord;
    }



    public void setHdd(String hdd) {
        this.hdd = hdd;
    }



    public void setRam(String ram) {
        this.ram = ram;
    }


    /**
     * 显示电脑配置
     */
    public void show(){
        System.out.println("主板"+mainbord);
        System.out.println("硬盘"+hdd);
        System.out.println("内存"+ram);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值