zoukankan      html  css  js  c++  java
  • Spring学习之路-从放弃到入门

      AOP:方法拦截器

      IOC:类管理容器

      

      主要讲讲这一天看Spring视频学到的东西,以下的叫法全是自创的。

    1、类实例管理容器

      关于Spring,首先是对类的管理,在常规情况,生成一个类需要调用new方法,如图:

    public class Hello {
        public void say(){
            System.out.println("Hello");
        }
        public static void main(String[] a){
            Hello h = new Hello();
            h.say();
        }
    }

      但是Spring可以替我们创建并管理类的实例,配置如图:

    beans.xml

        <bean id="hello" class="spring.Hello"/>

      在xml文件中配置好对应的id与class后,可以通过一个上下文对象,根据id来获取对应的类:

    public class Hello {
        public void say(){
            System.out.println("Hello");
        }
        public static void main(String[] a){
            ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
            Hello h = (Hello)ctx.getBean("hello");
            h.say();
        }
    }

      这个类的默认形式是单例,可以通过设置scope值来改变其形式。

    2、类依赖管理

      除了可以生成类实例,还能通过配置来管理类之间的依赖。

      直接上代码:

    public class Hello {
        private HelloWorld h;
        public void setH(HelloWorld h) {
            this.h = h;
        }
        public void say(){
            System.out.println("Hello");
            h.say("12345");
        }
    }

      这里Hello类内部有一个HelloWorld类,如果需要调用,必须要new HelloWorld得到一个实例。

      但是用xml的配置,可以省略这个过程:

    beans.xml

        <bean id="hello" class="spring.Hello">
            <property name="h" ref="h"></property>
        </bean>
        <bean id="h" class="spring.HelloWorld"></bean>

      这里的property代表初始化Hello类时传入的参数,name代表成员变量名,ref对应下面的id,代表是一个类的引用。

    3、注解

      使用注解也能完成上面的功能,而且更加方便,首先在xml配置如下:

    beans.xml

    <context:component-scan base-package="spring"/>

      这个代表对spring包下所有的类进行注解搜索解析。

      这里有几种注解,作用貌似差不多:component、Repository、Service,这些可以将类注册到bean中,语义上有些不同。

      比如说:

    @Repository("HelloWorld")
    public class HelloWorld {
        public void say(String str){
            System.out.println("Hello: " + str);
        }
    }

      注解括号的字符串代表之前那个id。

      如果不加括号也可以,默认id规则遵循类名首字母小写再拼上其余字母,即HelloWorld => helloWorld。

      类依赖就更加简单了,直接加个注解,连set方法都省了,如下:

    @Service
    public class Hello {
        @Resource
        private HelloWorld h;
        public void say(){
            System.out.println("Hello");
            h.say("12345");
        }
        public static void main(String[] a){
            ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
            Hello h = (Hello)ctx.getBean("hello");
            HelloWorld h2 = (HelloWorld)ctx.getBean("helloWorld");
            h.say();
        }
    }

      Spring会根据HelloWorld类的类名自动寻找匹配,然后进行set操作。

      至于那些ByName、ByType等等,太麻烦,等用到的时候再去查。

      最后还有一个关于文件引入的注解,可以将外部的文件引入当前类,然后通过另外一个注解给成员变量赋值:

    @Configuration
    @ImportResource("classpath:abc.xml")
    public class Hello {
        @Value("${xxx}")
        private HelloWorld h;
    }

      这个没有去试,等我撸完MVC和数据库写demo的时候,再回头试试。

      (已学会简单CRUD,真简单……)

    4、生命周期的钩子函数

      可以通过实现InitializingBean、DisposableBean接口,并重写afterPropertiesSet、destroy方法,这两个方法会在实例被完全构造完或销毁时执行,具体代码实例如下:

    @Service
    public class bean implements InitializingBean,DisposableBean {
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("bean init");
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println("bean destroy");
        }
    }

      此时,启动服务器可以看到:

      然后,点击STOP关闭服务器可以看到:(毛都看不到)

      因为强制关闭服务器太暴力了,没有机会执行销毁方法, 模拟不出来。

      当然也可以在配置中指定init-method和destroy-method方法:

    <bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>
    <bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>

      当然,最推荐的方法当然是注解:

    @Service
    public class bean {
        @PostConstruct
        public void init(){
            System.out.println("bean init");
        }
        @PreDestroy
        public void destroy(){
            System.out.println("bean destroy");
        }
    }

      这样方法名可以完全自由,不用与配置文件一一对应或者是接口的固定方法。

      最后,可以通过全局配置,来定义所有IOC容器类的init和destroy方法:

    <beans default-init-method="init"/>

      大概Spring就这么多东西,事务?不知道不知道,超纲了,学完Spring和Mybatis再回头搞。

  • 相关阅读:
    修改带!important的css样式
    解决Eclipse导入项目是提示错误:Some projects cannot be imported because they already exist in the workspace
    HTML5——canvas:使用画布绘制卡片
    vue:更改组件样式
    导入导出大量excel文件
    winfrom控件Treeview绑定数据库中的资料(节点控件)
    Winfrom将excel中的数据导入sqlserver数据库中的方法
    C# 将DataTable表中的数据批量插入到数据库表中的方法
    创建Sql数据表的sql代码
    Winfrom之SplitContainer控件
  • 原文地址:https://www.cnblogs.com/QH-Jimmy/p/7841857.html
Copyright © 2011-2022 走看看