Spring框架之IOC

一、ssm分层架构示意图 

ssm分层框架 

二、Spring核心

ioc(控制反转)和aop(面向切面开发) Di(Dependencecy Injection) 依赖注入

ioc:将对象的创建权利反转交给Spring框架

IOC的主要目的(好处):降低了程序的耦合度

我们知道在Java程序中要想将对象创建交给程序来完成的话,那就只有使用反射了,其实IOC的底层就是通过反射来完成的

三、使用IOC创建对象,并部署基本的ssm框架

1.创建一个maven项目

2.引入相关jar包

引入依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.12</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

3.创建包 

Service层的结构

impl是接口实现类的包 

接口

public interface UserService {
    void hello();
}

实现类 

public class UserServiceImpl implements UserService {
    @Override
    public void hello(){
        System.out.println("业务层,你好");
    }
}

4.创建一个测试类

由于刚才在pom.xml中引入了单元测试依赖junit 

 

所以现在只要给普通方法加上@Test注解后该方法也会像main方法一样可以进行测试运行了,如下图

public class UserServiceTest {
    
    @Test
    public void run(){
        UserService userService = new UserServiceImpl();
        userService.hello();
    }

}

上面的代码是我们创建对象和调用对象方法的最长用到到的方式,并没有涉及到Spring框架的IOC技术

下面我们来使用IOC完成上面的工作

5.使用IOC创建对象

首先我们要介绍一下,Maven项目里面的三个文件夹

其中类路径用来存放一些配置文件,我们如果想要使用IOC的话就需要一个配置文件对Spring框架进行一些配置。

前面这部分可以随便起名字的,不过我们一般叫他的默认名字applicationContext.xml

applicationContext内容

<?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">
    <!--ioc bean管理-->
    <bean id="us" class="com.exam.service.impl.UserServiceImpl"></bean>

</beans>

下面是对applicationContext中内容的一些解释

这里解释一下约束:

约束就是规定了文档中能够使用的标签,必须是约束中规定的(比如<bean></bean>),不能够随意书写。

如下图,分别是有约束和无约束的情况:

1.有约束<ss></ss>会报错

2.无约束<ss></ss>不会报错

3.id和class.

 <bean id="us" class="com.exam.service.impl.UserServiceImpl"></bean>

<bean></bean> 这是xml的固定写法,用来描述将那个类交给IOC去管理,并创建对象

id=“us”这是一个标识,这里可以简单理解为变量名

class="com.exam.service.impl.UserServiceImpl":这个是需要交给IOC管理的类,由于通过反射去创建对象有一种方式是通过获得类的类全名来创建,所以这里给出的就是类全名

通过这种方式创建的对象,会放入一个IOC容器(或者说是IOC池子中),对象在IOC中的呈现方式是一键值对集合Map的方式呈现的(<key,value>形式,key是对象的标识(例如上面的"us"),value是ioc创建的对象)

 ApplicationContext是一个接口,下面的两种实现类有什么区别

        //创建spring ioc工厂,目的是加载spring配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext();
        ApplicationContext af = new FileSystemXmlApplicationContext();

两个类都是用来加载配置文件xml的

 ClassPathXmlApplicationContext:

配置文件如果在类路径下的话话使用此类(常用)

FileSystemXmlApplicationContext

如果配置文件在本地磁盘,例如C盘或者D盘的某个位置,就使用此方法(让配置文件与项目分离管理,不常用)

使用IOC创建对象的代码如下

    @Test
    public void run2(){
        //创建spring ioc工厂,目的是加载spring配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //创建bean对象
        UserService userService = (UserService) ac.getBean("us");
        userService.hello();
    }

四、IOC中bean的属性

IOC.bean

        1.id属性 就是给bean起个名字,注意id属性的值必须是唯一的,不能重复

        id取值要求必须以字母开头,可以使用数字、连字符、下划线,不能出现特殊字符

        2.class属性 值是bean对象的全路径

        3.scope:表示bean对象的作用范围

  •  singleton  单例(默认) 最常用的方式,生命周期跟配置文件相同,加载配置文件时创建实例
  • prototype  多例,不是配置文件加载时创建实例,而是获取实例时创建对象
  • request  多例,不常用,多用于web项目中,每次http请求时会创建一个创建一个实例
  • session 多例,不常用,多用于web项目中,同一个session中可能有很多请求,这些请求共用一个实例

演示一下两个最常用的:

    public UserServiceImpl(){
        System.out.println("我创建了");
    }
<bean id="us" class="com.exam.service.impl.UserServiceImpl" scope="singleton"></bean>

    <bean id="us" class="com.exam.service.impl.UserServiceImpl" scope="prototype"></bean>

如果在Test中调用获取对象

    @Test
    public void run2(){
        //创建spring ioc工厂,目的是加载spring配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //创建bean对象
        UserService userService = (UserService) ac.getBean("us");
//        userService.hello();
    }

        4.init-method  用于配置一个bean对象创建时的制定方法并调用

                UserServiceImpl类中

    public void Init(){
        System.out.println("对象初始化方法");
    }

                xml文件

<bean id="us" class="com.exam.service.impl.UserServiceImpl" init-method="Init"></bean>

        5.destory-method  用于配置一个bean对象销毁时的制定方法并调用

五、实例化bean的三种方式

        1.默认是使用无参数的构造方法(默认方式,基本上都是使用这种)

        2.静态工厂实例化方式(好处是可以自己编写业务逻辑,用类调用方法

package com.exam.util;

import com.exam.service.UserService;
import com.exam.service.impl.UserServiceImpl;

public class StaticFactory {
    public static UserService createUs(){
        System.out.println("通过静态工厂的方式");
        //编写业务逻辑...
        return new UserServiceImpl();
    }
}
<bean id="us" class="com.exam.util.StaticFactory" factory-method="createUs"/>

        3.实例化工厂实例化方式(好处是可以自己编写业务逻辑,用对象调用

    public UserService createUse(){
        System.out.println("通过实例化工厂的方式");
        //编写业务逻辑...
        return new UserServiceImpl();
    }
    <bean id="dFactory" class="com.exam.util.Factory"/>
    <bean id = "us" factory-bean="dFactory" factory-method="createUs"/>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值