Spring
spring一般指的是一个全家桶。
项目中只有浏览器一个客户端,所以项目中DataFlow是用不上的。
只是做基本的web开发springboot就可以了,build anything。
如果想做微服务那么就用springcloud,能够协调一切coordinate anything。
如果想做更多的客户端及集成,spring cloud data flow可以连接一切。
这些都是基于Spring Framework框架的。
Spring Framework
IoC、AOP都是用来管理对象的思想。
- Spring Core的核心
- IoC/AOP 都是管理对象的思想,IoC是面向对象,AOP是面向切面的思想,所以有这两个思想能够管理一切对象。
- Spring Data Access
- 用来管理数据库事务。
- Web Servlet
- 使用SpringMVC来管理Web开发。
- Integration继承
- 用来集成Email、AMQP消息队列、Security安全控制等等。
IoC
Spring所有功能都是可以说以IoC为基础的。
- Inversion of Control
- 控制反转,是一种面向对象编程的思想。
- 通常关联对象是new一个对象a,然后a.setB创建B的对象,但是缺点就是A和B进行了耦合,如果项目变大了,那么就不方便维护。所以IoC是为了解决耦合度的问题。
- ioc是靠 Dependency Injection来实现的,即依赖注入。
- 而依赖注入是ioc容器实现的关键,本质上就是工厂。
bean与bean之间的关联是在配置中体现的,降低了耦合度。
@springbootapplication这个注解是由其他注解组成的。
按住control点进去可以发现构成这个注解的注解有哪些。
@componentscan就是配置类扫描,哪些类能被扫描呢,就是需要@Controller和@Service、@Repository等四个配置才能被自动扫描到。
如果是业务组件就需要@Service组件才能被扫描,如果是控制组件就需要@Controller。
【重要注解:①@controller(请求)、@Repository(数据库)、@Service(业务)和@Component(任意调用)可以使得spring容器扫描bean;可以直接使用application.getbean()的方式获得,也可以使用@Autowired依赖注入的方式;如果bean出现重名,可以使用name将其区分开,也可以使用@primary设置其优先级;默认创建的bean对象都是单例的,如果需要改变不是单例@singlone可以写成@prototype改变成多例的。】如何证明这个容器存在呢,可以这么证明:
这样子控制台可以看到输出了这个容器,是可见的,是存在的。那么如何运用这个容器去管理Bean呢?
现在写一个bean,现在假设要访问数据库,那么我建一个包专门用来管理访问数据库,这个包下建立接口等等。
接口不能直接用,还得加一个接口的实现类。
然后增加这个接口的具体实现方法。同时注意在类上加上注解,让程序自动扫描。
然后就可以从容器中获取到这个Bean了。
这样就成功获取到了Bean,并得到了结果。
这样做的好处:再次通过一个实例来观察。
做完上面这一张图需要注意加注解,同时这个时候因为我们是getBean去获取,那么此时满足条件的就有两个了,Bean容器就不知道给你哪一个了。
然后这个时候只需要在希望得到的Bean加一个注解就可以优先得到了。
调用的Bean是依赖的接口,不依赖本身,则是面向接口的思想,就比较方便,但是也可能会带来一个问题,如果某一块不想要MyBatis,那么就需要强制容器进行返回就可以了。
除了上面这个方法,还可以通过加前缀强制转型。
现在如果该多了一个service层,那么可以如 下图一样进行添加。
现在希望容器管理这个Bean销毁和初始化那些方法,那么想要容器调用这些方法需要添加@PostConstruct方法就可以了。通常在构造器后进行调用。
现在在测试类进行测试演示。
然后可以发现在控制台打印了这些方法。
然后通过打印台可以看出,这些Bean都是实例化一次的,只实例一次的。
开始被实例、初始化,然后结束后销毁。
就算调用两次,控制台也是出来一次的。
可以看出是单例的。如果不希望是单例的,希望整个容器中有多个,那么就需要加一个注解。
这样每次访问该Bean的时候都会加一个实例。
但是通常情况下都是单例的情况。
- 以上都是管理自己的Bean,那么如果想调用第三方的话,那么就需要自己写一个配置类,装配一个第三方的Bean。
- 配置类可以建一个包 config包。
同时需要注意下图中的方法名就是Bean的名字。
这个时候也就说这个方法的返回类型将被装配到容器里进行反复运用。然后再 在测试类中进行测试,再添加一个测试方法。
先声明类型然后进行getBean就可以了。下图中调用这个对象去初始化一个当前时间。
上述讲的都是主动调用容器的方法。
但是一般是自动注入容器等。接下来讲 依赖注入。只需要声明给当前的Bean注入Alpdao就可以了。
那么注入的话需要用到@Autowired注解。
然后加在一个成员变量之前。
那么就是说,希望容器把alphadao注入给这个属性,给我们直接使用就可以了。(DI依赖注入)
发现可以打印出结果的。
同理,alphaService也是可以的,SimpleDateFormat也是可以的。
这个时候都取到了。
但如果想改注入的东西,比如说alphadao不要alphadao而是hibernate,那么就可以添加一个注释就可以了。(即忽视优先级)
实际业务中:controller处理浏览器的请求,来调用service处理业务,然后service调用dao处理。彼此互相依赖的,他们的关系就可以通过依赖注入实现。
比如说现在需要注入alphadao给alphaserrvice。那么就可以在处理业务的时候调用service了。
然后写一个方法模拟查询的业务就可以了。
然后再controller中将service注入给他,然后处理一个查询请求的方法就可以了。
- 整理一下:首先调用controller,然后controller调用service中的find方法,然后find方法中又调用alohadao的方法,然后就是这么实现的。通过这样的例子理解DI的概念。
- 通过容器统一的管理,降低Bean之间的耦合度。
- (可以看到,在controller层中,我们调用了service层的代码,却不是直接new一个对象,而是用@Autowired注解,并在类上使用了@Controller注解,这些注解帮助我们自动配置并注入对象,我们在使用时就不用new对象,从而减少代码耦合。)