zoukankan      html  css  js  c++  java
  • 使用Spring框架入门一:基于XML配置的IOC/DI的使用

    一、Spring框架

      1、方法一:逐项导入基础依赖包:

        spring-core、spring-beans、spring-context、spring-expression

      2、方法二:最简洁的导入,直接导入spring-context包:  

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.0.5.RELEASE</version>
            </dependency>

      在pom.xml中加入上spring-context的依赖,它便会自动导入上述四个包。

      3、参考本项目结构图:

      

    二、操作案例

      1、建立几个类对象,便于测试。

      

    package test1;
    
    import lombok.Data;
    
    @Data
    public class User {
    
        private String name;
        private int age;
    
        public void add() {
            System.out.println("user add method executed.");
        }
    
    }

      注意,此类中,使用了lombok框架的@Data方式来实现的Getter和Setter和无参构造函数。引入lombok的方法是添加下列依赖,并为Idea安装一个lombok的插件,并启动注释的编译:

    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.20</version>
        <scope>provided</scope>
    </dependency>

      2、建立一个非静态的工厂类,用于测试非静态工厂方式创建Bean。

    package test1;
    
    public class UserFactory {
        public User createUser() {
            User user = new User();
            user.setAge(12);
            user.setName("张三");
            return user;
        }
    }

      3、再创建一个的工厂类,添加一个静态方法,用于测试静态方法创建Bean。

    package test1;
    
    public class UserStaticFactory {
        public static User createUser() {
            User user = new User();
            user.setAge(22);
            user.setName("张五");
            return user;
        }
    }

      4、再建立一个Student类,用来测试多种不同构造函数的情况:

    package test1;
    
    import lombok.Data;
    
    import java.util.List;
    import java.util.Map;
    
    @Data
    public class Student {
        private final String name;
        private final int age;
        private List<User> users;
        private User user;
        private Map<String, String> map;
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public Student(User user) {
            this.user = user;
            this.name = "另外一个有参数构建Name1";
            this.age = 2;
        }
    
        public Student(List<User> users) {
            this.users = users;
            this.name = "另外一个有参数构建Name2";
            this.age = 33;
        }
    
        public Student(Map<String, String> map) {
            this.map = map;
            this.name = "另外一个有参数构建Name2";
            this.age = 33;
        }
    }

      5、在Maven项目的resources中添加一个xml(在WEB项目中要放在/WEB-INF/下),官方建议命名为:applicationContext.xml,我们为了方便做多项测试,因此就故意起个别的名字,比如:applicationContextTest1.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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <!--方式一:直接创建-->
        <bean id="myUser1" class="test1.User">
            <property name="name" value="songxingzhu"/>
            <property name="age" value="10"/>
        </bean>
    
        <!--方式二:非静态工厂创建-->
        <bean id="userFactory" class="test1.UserFactory"/>
        <!--使用scope设置为prototype(默认为singleton)让每次产生新实例-->
        <bean id="myUser2" factory-bean="userFactory" factory-method="createUser" scope="prototype">
            <property name="name" value="修改后的Name"/>
        </bean>
    
        <!--方式三:静态方法创建-->
        <bean id="myUser3" class="test1.UserStaticFactory" factory-method="createUser"></bean>
    
        <!--构建函数的情况一:普通参数 -->
        <bean id="myStudent1" class="test1.Student">
            <constructor-arg name="name" value="Sindrol"/>
            <constructor-arg name="age" value="23"/>
        </bean>
        <!--构建函数的情况二:Bean -->
        <bean id="myStudent2" class="test1.Student">
            <constructor-arg name="user" type="test1.User" ref="myUser3"/>
        </bean>
        <!--构建函数的情况三:Map -->
        <bean id="myStudent3" class="test1.Student">
            <constructor-arg name="map">
                <map key-type="java.lang.String" value-type="java.lang.String">
                    <entry key="key1" value="value1"/>
                    <entry key="key2" value="value2"/>
                </map>
            </constructor-arg>
        </bean>
        <!--构建函数的情况四:List -->
        <bean id="myStudent4" class="test1.Student">
            <constructor-arg name="users">
                <array>
                    <ref bean="myUser1"/>
                    <ref bean="myUser2"/>
                </array>
            </constructor-arg>
        </bean>
    </beans>

       6、调用Spring框架

      (1)调用代码:

    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import test1.Student;
    import test1.User;
    
    public class BeanTest {
        @Test
        public void test1() {
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextTest1.xml");
            User myUser1 = (User) context.getBean("myUser1");
            System.out.println(myUser1);
            User myUser2 = (User) context.getBean("myUser2");
            System.out.println(myUser2);
            User myUser2_2 = (User) context.getBean("myUser2");
            System.out.println("[user2==myUser2_2]:" + (myUser2 == myUser2_2));
            User myUser3 = (User) context.getBean("myUser3");
            System.out.println(myUser3);
    
            Student student1 = (Student) context.getBean("myStudent1");
            System.out.println(student1);
            Student student2 = (Student) context.getBean("myStudent2");
            System.out.println(student2);
            Student student3 = (Student) context.getBean("myStudent3");
            System.out.println(student3);
            Student myStudent4 = (Student) context.getBean("myStudent4");
            System.out.println(myStudent4);
    
    
        }
    }

      (2)测试结果:

    "C:Program FilesJavajdk1.8.0_161injava" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:ApplicationDevToolsJetBrainsIntelliJ IDEA 2018.1libidea_rt.jar=9042:D:ApplicationDevToolsJetBrainsIntelliJ IDEA 2018.1in" -Dfile.encoding=UTF-8 -classpath "D:ApplicationDevToolsJetBrainsIntelliJ IDEA 2018.1libidea_rt.jar;D:ApplicationDevToolsJetBrainsIntelliJ IDEA 2018.1pluginsjunitlibjunit-rt.jar;D:ApplicationDevToolsJetBrainsIntelliJ IDEA 2018.1pluginsjunitlibjunit5-rt.jar;C:Program FilesJavajdk1.8.0_161jrelibcharsets.jar;C:Program FilesJavajdk1.8.0_161jrelibdeploy.jar;C:Program FilesJavajdk1.8.0_161jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.8.0_161jrelibextcldrdata.jar;C:Program FilesJavajdk1.8.0_161jrelibextdnsns.jar;C:Program FilesJavajdk1.8.0_161jrelibextjaccess.jar;C:Program FilesJavajdk1.8.0_161jrelibextjfxrt.jar;C:Program FilesJavajdk1.8.0_161jrelibextlocaledata.jar;C:Program FilesJavajdk1.8.0_161jrelibext
    ashorn.jar;C:Program FilesJavajdk1.8.0_161jrelibextsunec.jar;C:Program FilesJavajdk1.8.0_161jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.8.0_161jrelibextsunmscapi.jar;C:Program FilesJavajdk1.8.0_161jrelibextsunpkcs11.jar;C:Program FilesJavajdk1.8.0_161jrelibextzipfs.jar;C:Program FilesJavajdk1.8.0_161jrelibjavaws.jar;C:Program FilesJavajdk1.8.0_161jrelibjce.jar;C:Program FilesJavajdk1.8.0_161jrelibjfr.jar;C:Program FilesJavajdk1.8.0_161jrelibjfxswt.jar;C:Program FilesJavajdk1.8.0_161jrelibjsse.jar;C:Program FilesJavajdk1.8.0_161jrelibmanagement-agent.jar;C:Program FilesJavajdk1.8.0_161jrelibplugin.jar;C:Program FilesJavajdk1.8.0_161jrelib
    esources.jar;C:Program FilesJavajdk1.8.0_161jrelib
    t.jar;D:ProjectsJavaProjectsStudyDemoSpringDemo	arget	est-classes;C:UsersSindrol.m2
    epositoryorgspringframeworkspring-context5.0.5.RELEASEspring-context-5.0.5.RELEASE.jar;C:UsersSindrol.m2
    epositoryorgspringframeworkspring-aop5.0.5.RELEASEspring-aop-5.0.5.RELEASE.jar;C:UsersSindrol.m2
    epositoryorgspringframeworkspring-beans5.0.5.RELEASEspring-beans-5.0.5.RELEASE.jar;C:UsersSindrol.m2
    epositoryorgspringframeworkspring-core5.0.5.RELEASEspring-core-5.0.5.RELEASE.jar;C:UsersSindrol.m2
    epositoryorgspringframeworkspring-jcl5.0.5.RELEASEspring-jcl-5.0.5.RELEASE.jar;C:UsersSindrol.m2
    epositoryorgspringframeworkspring-expression5.0.5.RELEASEspring-expression-5.0.5.RELEASE.jar;C:UsersSindrol.m2
    epositoryjunitjunit4.12junit-4.12.jar;C:UsersSindrol.m2
    epositoryorghamcresthamcrest-core1.3hamcrest-core-1.3.jar;C:UsersSindrol.m2
    epositoryorgprojectlomboklombok1.16.20lombok-1.16.20.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 BeanTest,test1
    五月 05, 2018 7:47:45 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
    信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@22a71081: startup date [Sat May 05 19:47:45 CST 2018]; root of context hierarchy
    五月 05, 2018 7:47:45 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    信息: Loading XML bean definitions from class path resource [applicationContextTest1.xml]
    User(name=songxingzhu, age=10)
    User(name=修改后的Name, age=12)
    [user2==myUser2_2]:false
    User(name=张五, age=22)
    Student(name=Sindrol, age=23, users=null, user=null, map=null)
    Student(name=另外一个有参数构建Name1, age=2, users=null, user=User(name=张五, age=22), map=null)
    Student(name=另外一个有参数构建Name2, age=33, users=null, user=null, map={key1=value1, key2=value2})
    Student(name=另外一个有参数构建Name2, age=33, users=[User(name=songxingzhu, age=10), User(name=修改后的Name, age=12)], user=null, map=null)

     

  • 相关阅读:
    阿里云中挖矿病毒
    flutter 返回刷新页面
    PM2 常用命令
    阿里云Redis 配置
    stm32f407启动文件分析
    C++类的前置声明
    Qt快速入门学习笔记(画图篇)
    Qt快速入门学习笔记(基础篇)
    Qt入门实例
    Qt编码设置
  • 原文地址:https://www.cnblogs.com/songxingzhu/p/8995758.html
Copyright © 2011-2022 走看看