继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

使用 intellijIDEA 创建 maven 工程进行 Spring ioc 测试

慕桂英546537
关注TA
已关注
手记 345
粉丝 31
获赞 200

ioc 概念

控制反转(Inversion of Control,缩写为IOC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

IOC和DI区别

  • IOC: 控制反转,把对象创建交给spring进行配置

  • DI: 依赖注入,向类里面的属性中设置值

  • 关系:依赖注入不能单独存在,需要在ioc基础之上完成操作

创建 spring 实例进行 ioc 测试

我们使用 intellijIDEA 来完成这一操作,首先创建 maven 工程(maven提供了 java 中 jar 包的下载管理,方便我们使用下载和导入 jar 包,推荐使用)。打开 idea,选择 Create New Project, 在弹出来的窗口中选择创建 maven 工程,设置好 JDK 后点击 next 进行下一步。

5b7831e4000143c009850568.jpg

设置好 GrouId、ArtifactId、Version 后,按提示一路设置创建好 maven 项目。
5b7831e40001fe1f09840567.jpg

我们修改 pom.xml 设置,配置需要添加下载的 jar 包:

 <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

    </dependencies>

当我们修改pom.xml 文件时,idea 会提示我们导入,我们点击 Import Change即可,当然也可以设置Auto-Import自动导入:

5b7831e40001ba5e04130112.jpg

我们在 src/main/java 下新建一个 package:cn.itcast.ioc, 并在 package 下新建 User.java:

package cn.itcast.ioc;public class User {    public void add(){
        System.out.println("add......");
    }    //public static void main(String[] args) {
        //原始做法
        //User user = new User();
        //user.add();
    //}}

在 resources目录下新建 applicationContext.xml 配置文件:

<?xml version="1.0" encoding="UTF-8"?><!-- scheme约束 --><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 id="user" class="cn.itcast.ioc.User"></bean></beans>

然后在 src/main/java 下创建测试文件 TestIOC.java ,尝试能否通过装载 bean,交由 spring 创建对象,通过配置文件输出 ioc 实例:

package cn.itcast.ioc;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestIOC {    @Test
    public void testUser(){        //1.加载 spring 配置文件,根据创建对象
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");        //2.得到配置创建的对象
        User user = (User) context.getBean("user");
        user.add();
    }
}

运行 TestIOC.java , 若控制台能输出 add() 方法,便测试成功。

5b7831e50001253104520117.jpg

通过配置文件注入属性

介绍:创建对象时候,向类里面属性设置值。

在 spring 中我们一般采用通过set 方法注入。

举个栗子:

在 src/main/java/ 下创建 UserService.java:

package cn.itcast.ioc;public class UserService {    //1 定义 user 类型
    private User user;    //2 生成set 方法
    public void setUser(User user) {        this.user = user;
    }    public void add(){
        System.out.println("service....");
        user.add();
    }
}

修改 applicationContext.xml 文件:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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"><!-- 注入对象类型 -->
    <!-- 配置 service 和 user 对象 -->
    <bean id="user" class="cn.itcast.ioc.User"></bean>
    <bean id="userService" class="cn.itcast.ioc.UserService">
        <!-- 注入 user 对象
                name 属性值, service 类里面的属性名称
                ref 属性, 配置bean 标签中 id 值
       -->
        <property name="user" ref="user"></property>
    </bean></beans>

修改 TestIOC.java:

package cn.itcast.ioc;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestIOC {    @Test
    public void testUser(){        //1.加载 spring 配置文件,根据创建对象
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");        //2.得到配置创建的对象
        UserService userService = (UserService) context.getBean("userService");
        userService.add();
    }
}

成功在控制台输出 UserService类的 add() 方法和注入的属性:

5b7831e700016b0602920126.jpg

通过注解创建 ioc 实例

上述实例是通过配置 xml 文件来实现创建对象的功能,spring 也提供了另一种方式来实现上述功能:注解。

注解介绍

  • 代码里面特殊标记,使用注解可以完成功能

  • 注解写法 @注解名称(属性名称=属性值)

  • 注解使用在类上面,方法上面和属性上面

创建对象的四个注解

  • @Component

  • @Controller

  • @Service

  • @Repository

主要是通过 Component 衍生出 其他三个在web 层、业务层、持久层注解,主要是为了后续增强。但对我来说这四个注解功能目前来说是一样的,都是创建对象。

我们重新配置一下 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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->

    <!-- 开启注解扫描
        (1) 到包里面扫描类,方法,属性上面是否有注解
    -->
    <context:component-scan base-package="cn.itcast.ioc"></context:component-scan>
    <!-- 扫描属性上面的注解 -->
    <!--<context:annotation-config></context:annotation-config>--></beans>

修改 User.java 文件:

package cn.itcast.ioc;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Component;import org.springframework.stereotype.Service;@Service(value = "user")  //相当于<bean id="user" class=""/>@Scope(value = "prototype") //多实例public class User {    public void add(){
        System.out.println("add........");
    }
}

修改TestIOC.java:

package cn.itcast.ioc;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestIOC {    @Test
    public void testUser(){        //1.加载 spring 配置文件,根据创建对象
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");        //2.得到配置创建的对象,这里的getBean()方法中的 user 为User类通过注解的 value 值。
        User user = (User) context.getBean("user");
        user.add();
    }
}

控制台成功输入User 类的 add()方法:

5b7831e50001253104520117.jpg

通过注解注入属性

同样的,我们可以通过使用注解注入属性。

这里有两种方式,我们可以通过使用 @Autowired(自动注入)或 @Resource(name="value")(name属性值:注解创建对象 value 值),推荐使用后一种。

注:使用注解不需要 set 方法。

还是举个栗子:

在 src/main/java/ 下创建 package 和 UserDao.java 和 UserService.java。

UserDao.java:

package cn.itcast.anno;import org.springframework.stereotype.Service;@Service(value = "userDao")public class UserDao {    public void add(){
        System.out.println("dao.........");
    }
}

UserService.java:

package cn.itcast.anno;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import javax.annotation.Resource;@Service(value = "userService")public class UserService {    //得到dao 对象
    //定义 dao 类型
    //方法一:在 dao属性上面使用注解,完成对象注入//    @Autowired//    private UserDao userDao;
    //使用注解不需要set 方法
    
    //方法二:
    //name属性值: 注解创建 dao对象 value 值
    @Resource(name = "userDao")    private UserDao userDao;    public void add(){
        System.out.println("service.......");
        userDao.add();
    }
}

使用上述 applicationContext.xml 中的注解配置,创建 TestAnno.java:

package cn.itcast.anno;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestAnno {    @Test
    public void TestService(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) context.getBean("userService");
        userService.add();
    }
}

运行 TestAnno.java ,控制台输出如下信息:

5b7831e70001b3b603280133.jpg

总结:

  • 通过 spring框架的 ioc 容器,我们可以把对象的创建交给 spring 进行,降低代码的耦合度。

  • 使用 spring 框架 ioc 容器,可以通过配置 xml 文件和注解两种方式进行管理。

  • 掌握注入属性的两种方式:配置 xml 文件和注解。

  • 先创建对象,再注入属性。

 原文出处:https://www.cnblogs.com/weixuqin/p/9498918.html

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP