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再回头搞。

posted @ 2017-11-16 00:12  书生小龙  阅读(464)  评论(1编辑  收藏  举报