AOP:方法拦截器

  IOC:类管理容器

  

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

1、类实例管理容器

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

  1. public class Hello {
  2. public void say(){
  3. System.out.println("Hello");
  4. }
  5. public static void main(String[] a){
  6. Hello h = new Hello();
  7. h.say();
  8. }
  9. }

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

beans.xml

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

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

  1. public class Hello {
  2. public void say(){
  3. System.out.println("Hello");
  4. }
  5. public static void main(String[] a){
  6. ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
  7. Hello h = (Hello)ctx.getBean("hello");
  8. h.say();
  9. }
  10. }

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

2、类依赖管理

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

  直接上代码:

  1. public class Hello {
  2. private HelloWorld h;
  3. public void setH(HelloWorld h) {
  4. this.h = h;
  5. }
  6. public void say(){
  7. System.out.println("Hello");
  8. h.say("12345");
  9. }
  10. }

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

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

beans.xml

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

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

3、注解

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

beans.xml

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

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

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

  比如说:

  1. @Repository("HelloWorld")
  2. public class HelloWorld {
  3. public void say(String str){
  4. System.out.println("Hello: " + str);
  5. }
  6. }

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

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

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

  1. @Service
  2. public class Hello {
  3. @Resource
  4. private HelloWorld h;
  5. public void say(){
  6. System.out.println("Hello");
  7. h.say("12345");
  8. }
  9. public static void main(String[] a){
  10. ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
  11. Hello h = (Hello)ctx.getBean("hello");
  12. HelloWorld h2 = (HelloWorld)ctx.getBean("helloWorld");
  13. h.say();
  14. }
  15. }

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

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

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

  1. @Configuration
  2. @ImportResource("classpath:abc.xml")
  3. public class Hello {
  4. @Value("${xxx}")
  5. private HelloWorld h;
  6. }

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

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

4、生命周期的钩子函数

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

  1. @Service
  2. public class bean implements InitializingBean,DisposableBean {
  3. @Override
  4. public void afterPropertiesSet() throws Exception {
  5. System.out.println("bean init");
  6. }
  7.  
  8. @Override
  9. public void destroy() throws Exception {
  10. System.out.println("bean destroy");
  11. }
  12. }

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

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

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

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

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

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

  1. @Service
  2. public class bean {
  3. @PostConstruct
  4. public void init(){
  5. System.out.println("bean init");
  6. }
  7. @PreDestroy
  8. public void destroy(){
  9. System.out.println("bean destroy");
  10. }
  11. }

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

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

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

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

Spring学习之路-从放弃到入门的更多相关文章

  1. springboot 学习之路 1(简单入门)

    目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...

  2. Spring学习之路-从入门到放弃

    后台框架是真难入门啊!!!IDE的使用,环境的搭建,框架下载,上手,每一步都恶心人. 花了整整两天,才学会用idea,并且初步了解了maven(TM就是一个npm),然后跟着下载了对应的jar包,搭建 ...

  3. Spring学习之路-SpringBoot简单入门

    简单讲SpringBoot是对spring和springMVC的二次封装和整合,新添加了一些注解和功能,不算是一个新框架. 学习来源是官方文档,虽然很详细,但是太墨迹了… 地址:https://doc ...

  4. 走进Spring Boot源码学习之路和浅谈入门

    Spring Boot浅聊入门 **本人博客网站 **IT小神 www.itxiaoshen.com Spring Boot官网地址:https://spring.io/projects/spring ...

  5. Spring学习之路——简单入门HelloWorld

    Spring简单介绍 Spring是一个提供了解决J2EE问题的一站式框架. Spring的核心是反转控制,通过配置文件完成业务对象之间的依赖注入,他鼓励一个良好的习惯,就是注入对接口编程而不是对类编 ...

  6. Spring学习之路三——第一个Spring程序(体会IoC)

    体会IoC:Spring通过一种称作控制反转(IoC)的技术促进了松耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象.你可以认为IoC与JN ...

  7. Spring学习之路二——概念上理解Spring

    一.概念. Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Develop ...

  8. Spring学习之路一

    Spring 官网:http://projects.spring.io/spring-framework/ Spring下载地址:https://repo.spring.io/simple/libs- ...

  9. spring学习 十二 AspectJ-based的通知入门 带参数的通知

    第一步:编写通知类 package com.airplan.pojo; import org.aspectj.lang.ProceedingJoinPoint; public class Advice ...

随机推荐

  1. delphi 窗体自适应屏幕分辨率

    delphi 窗体自适应屏幕分辨率 这是个困惑我很长时间的问题,到今天终于得到解决了. 话说Delphi有个很强的窗体设计器,这一点让VC粉丝垂涎三尺而不可得.但是,Delphi里设计的窗体并没有自动 ...

  2. [控件]unigui移动端下Unidatepicker时间显示解决方案

    [控件]unigui移动端下Unidatepicker时间显示解决方案 http://tz10000.com/kong-jian-unigui-yi-dong-duan-xia-unidatepick ...

  3. 封装了三个对TMemoryStream操作的函数,大牛莫笑

    // TMemoryStream 转化为string字符串 function MemoryStreamToString(M: TMemoryStream): AnsiString; begin Set ...

  4. Android-Java-面向对象与面向过程的简单理解

    支持面向过程的语言有:C  Basic 等语言: 支持面向对象的语言有:C++  Java  C# 等语言: 面向过程:操作的是行为/功能: 面向对象:操作的是对象,而对象里面有功能行为,所以可以指定 ...

  5. iOS计算UIWebView的高度和iOS8之后的WKWebView的高度问题

    当我们涉及到webView和自定义控件结合的时候,例如一个资讯详情,上半部分是webView,下面位置想加上我们的自定义控件,可可以计算出webView的高度,在刷新界面. 下边是计算UIWebVie ...

  6. gcc 6.0编译opencv出错

    在编译opencv3.2时候,出现下面错误: cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_NE ...

  7. ASP.NET MVC基础知识

    1.MVC项目文件夹说明 App_Data:用来保存数据文件,比如XML文件等: App_Start:包含mvc系统启动的相关类: Controller:存放整个项目“控制器”的代码文件: Model ...

  8. Method not found: 'System.Data.Entity.ModelConfiguration.Configuration.XXX

    使用EF flument API  修改映射数据库字段的自增长 modelBuilder.Entity<Invoice>().Property(p => p.Id).HasDatab ...

  9. [Swift]lower_bound和upper_bound

    时间复杂度:一次查询O(log n),n为数组长度. [C++] lower_bound:返回大于等于val的第一个值 功能:查找非递减序列[first,last) 内第一个大于或等于某个元素的位置. ...

  10. 【xsy1130】tree 树形dp+期望dp

    题目写得不清不楚的... 题目大意:给你一棵$n$个节点的树,你会随机选择其中一个点作为根,随后随机每个点深度遍历其孩子的顺序. 下面给你一个点集$S$,问你遍历完$S$中所有点的期望时间,点集S中的 ...