zoukankan      html  css  js  c++  java
  • spring 学习(一):使用 intellijIDEA 创建 maven 工程进行 Spring ioc 测试

    spring学习(一):使用 intellijIDEA 创建 maven 工程进行 Spring ioc 测试

    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 进行下一步。

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

    我们修改 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自动导入:

    我们在 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() 方法,便测试成功。

    通过配置文件注入属性

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

    在 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() 方法和注入的属性:

    通过注解创建 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()方法:

    通过注解注入属性

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

    这里有两种方式,我们可以通过使用 @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 ,控制台输出如下信息:

    总结:

    • 通过 spring框架的 ioc 容器,我们可以把对象的创建交给 spring 进行,降低代码的耦合度。
    • 在 spring 框架 ioc 容器装配 bean,可以通过配置 xml 文件和注解两种方式进行管理。
    • 掌握注入属性的两种方式:配置 xml 文件和注解。
    • 先创建对象,再注入属性。
  • 相关阅读:
    NYOJ 10 skiing DFS+DP
    51nod 1270 数组的最大代价
    HDU 4635 Strongly connected
    HDU 4612 Warm up
    POJ 3177 Redundant Paths
    HDU 1629 迷宫城堡
    uva 796
    uva 315
    POJ 3180 The Cow Prom
    POJ 1236 Network of Schools
  • 原文地址:https://www.cnblogs.com/weixuqin/p/9498918.html
Copyright © 2011-2022 走看看