zoukankan      html  css  js  c++  java
  • spring01

                                                                       spring的体系结构图

    第一个spring入门例子

    01.创建一个java项目 引入所需要的jar包

    02.创建对应的包和类

    Animal接口对应的代码

    public interface Animal {
    
        String  eat(); //吃饭
        void sleep();  //睡觉
    }

    Dog类对应的代码

     

    public class Dog implements Animal {
    
    //无参构造 验证什么时候创建对象
    public Dog(){
    System.out.println("Dog的实例被创建了......");
    }
    
    @Override
    public String eat() {
    System.out.println("吃饭的方法");
    return null;
    }
    
    @Override
    public void sleep() {
    System.out.println("睡觉的方法");
    }
    
    }

    AnimalText对应的代码

      

    public class AnimalTest {
        
        @Test
        public  void  test01(){
            //之前的一种方式    耦合的!
            Animal animal=new Dog();
            animal.eat();
            animal.sleep();
        }
    }

    03.使用spring解耦的方式 创建applicationContext.xml文件 放在src的根目录下

    <?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 definitions here  我们的bean要定义在这个地方 -->
        <bean id="dog" class="cn.bdqn.dao.impl.Dog"/>
    </beans>

     04.在AnimalTest测试类中增加代码

        @Test
        public  void  test02(){
            /*
             * 使用spring  对象交给容器来创建 解耦
             * 01.引入jar
             * 02.创建容器applicationContext.xml
             * 03.加载spring的配置文件  创建容器   会把容器中所有的bean实例化   
             * 04.然后从容器中取Bean
             */
          ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
          System.out.println("*************************");
            //因为我们在容器中定义了ID  根据id找到对应的类 
          Animal dog=(Animal) context.getBean("dog");
          dog.eat();
          dog.sleep();
        }

    为什么 使用new ClassPathXmlApplicationContext来创建容器对象,由源码得知:

    05.在AnimalTest测试类中增加代码   使用其他的方式来创建容器

        @Test
        public  void  test03(){
            /*
             * 使用new FileSystemXmlApplicationContext来创建对象
             * 默认applicationContext.xml放在项目的根路径下面
             * 也可以放在电脑指定的盘符下d:/applicationContext.xml
             */
            ApplicationContext context=new FileSystemXmlApplicationContext("applicationContext.xml");
            System.out.println("*************************");
            //因为我们在容器中定义了ID  根据id找到对应的类 
            Animal dog=(Animal) context.getBean("dog");
            dog.eat();
            dog.sleep();
        }
        
        
        @Test
        public  void  test04(){
            /*
             * 使用BeanFactory来创建容器的时候,不会实例化容器中的Bean
             * 在getBean()才创建对应Bean的对象
             */
            BeanFactory context=new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
            System.out.println("*************************");
            //因为我们在容器中定义了ID  根据id找到对应的类 
            Animal dog=(Animal) context.getBean("dog");
            dog.eat();
            dog.sleep();
        }

     06.使用动态工厂来创建指定的对象

           001.创建一个AnimalFactory工厂类

            

    public class AnimalFactory {  //动态工厂
        
        public  AnimalFactory(){
            System.out.println("工厂的无参构造........");
        }
        
        //当调用这个方法的时候  返回一个 Dog对象
        public  Animal getDog(){
            System.out.println("工厂中获取Dog实例的方法");
            return new Dog();
        }
    
    }

         002.修改applicationContext.xml文件 之前的代码注释掉

     <!-- 使用动态工厂创建对象 -->
        <bean id="factory"  class="cn.bdqn.test.AnimalFactory"/>
        <!-- 通过 工厂的指定方法 来得到指定的对象 -->
        <bean id="dog" factory-bean="factory" factory-method="getDog"/>

        003.在AnimalTest测试类中创建对应的测试方法

        //使用动态工厂来创建对象
        @Test
        public  void  test05(){
          ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
          System.out.println("*************************");
            //因为我们在容器中定义了ID  根据id找到对应的类 
          Animal dog=(Animal) context.getBean("dog");
          dog.eat();
          dog.sleep();
        }

     07.使用静态的工厂来创建指定的对象

        001.修改上面创建的AnimalFactory类  把之前的getDog()注释掉

       

    //静态工厂    不会走无参构造
        public   static  Animal getDog(){
            System.out.println("工厂中静态获取Dog实例的方法");
            return new Dog();
        }

        002.修改applicationContext.xml文件  之前的代码注释掉

        <!--使用静态工厂创建对象   -->
        <bean id="dog" class="cn.bdqn.test.AnimalFactory" factory-method="getDog"/>

        003.在AnimalTest测试类中创建对应的测试方法

        //使用静态工厂来创建对象
        @Test
        public  void  test06(){
            ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
            System.out.println("*************************");
            //因为我们在容器中定义了ID  根据id找到对应的类 
            Animal dog=(Animal) context.getBean("dog");
            dog.eat();
            dog.sleep();
        }

     08.bean的单例和原型

        001.修改applicationContext.xml文件

         

       <!--bean的单例和原型
         singleton: 默认的方式创建bean,单例 在容器初始化的时候就创建了 对应的Bean对象
         prototype: 原型! 只有在需要对象(getBean())的时候会创建一个新的对象!
       -->
        <bean id="dog" class="cn.bdqn.dao.impl.Dog"  scope="prototype"/>

      002.在AnimalTest测试类中新增测试方法

        //bean的单例和原型
        @Test
        public  void  test07(){
            ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
            System.out.println("*************************");
            //获取两个对象  咱们观察  什么时候 执行  无参构造 
            Animal dog=(Animal) context.getBean("dog");
            Animal dog2=(Animal) context.getBean("dog");
        }

    003.执行代码 看效果

        scope="prototype"时:效果图如下

     scope="singleton",或者不写scope属性时:效果图如下

    09.设置bean的生命始末

      001.在Dog类中新增两个方法

     

        //初始化之后的方法
        public void  init(){
            System.out.println("初始化之后的方法");
        }
        
        //销毁之前的方法
        public void  destroy(){
            System.out.println("销毁之前的方法");
        }
        

     002.在applicationContext.xml文件中配置

     <!--设置bean的生命周期始末  -->
        <bean id="dog" class="cn.bdqn.dao.impl.Dog" init-method="init" destroy-method="destroy"/>

    003.在AnimalTest测试类中新增测试方法

        /*
         * 设置bean的生命周期始末
         * 01.在Dog类中新增两个方法  init() destroy()
         * 02.在容器中 配置
         *    init-method="init" destroy-method="destroy"
         */
        @Test
        public  void  test08(){
            ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
            System.out.println("*************************");
            Animal dog=(Animal) context.getBean("dog");
            System.out.println(dog);
            /*
             * 想看到destroy-method="destroy" 的效果 有两个前提
             * 01.bean必须是单例的
             * 02.容器需要手动的关闭
             */
            ((ClassPathXmlApplicationContext)context).close();
        }
  • 相关阅读:
    MongoDB4.0以下版本,同一台电脑安装2个MongoDB服务
    CMake编译Mysql connector C++
    Winsock I/O方法
    查看mysql版本的四种方法(转)
    WorkBench,DELETE 标准语句失败
    Qt 透明对话框 自定义透明度
    QString 分割字符串时产生乱码的问题
    winsock error 相关
    线程的分离状态与结合状态
    Oracle 语法
  • 原文地址:https://www.cnblogs.com/999-/p/6045616.html
Copyright © 2011-2022 走看看