• 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();
        }
  • 相关阅读:
    java多线程
    java垃圾回收
    java研发常见问题总结 1
    js获取时间加多山天和时间戳转换成日期
    php时间选择器亲测可以自己修改
    html5时间选择器
    php生成员工编号,产品编号
    桌面远程链接
    SQL 左外连接查询 将右表中的多行变为左表的一列或多列
    PHPMailer发匿名邮件及Extension missing: openssl的解决
  • 原文地址:https://www.cnblogs.com/xtdxs/p/7096027.html
Copyright © 2020-2023  润新知