当前位置 : 主页 > 编程语言 > java >

仿牛客网项目实战3:Spring入门

来源:互联网 收集:自由互联 发布时间:2023-03-22
Spring spring一般指的是一个全家桶。 项目中只有浏览器一个客户端,所以项目中DataFlow是用不上的。 只是做基本的web开发springboot就可以了,build anything。 如果想做微服务那么就用spring

Spring

spring一般指的是一个全家桶。

仿牛客网项目实战3:Spring入门_初始化

项目中只有浏览器一个客户端,所以项目中DataFlow是用不上的。

只是做基本的web开发springboot就可以了,build anything。

如果想做微服务那么就用springcloud,能够协调一切coordinate anything。

如果想做更多的客户端及集成,spring cloud data flow可以连接一切。

这些都是基于Spring Framework框架的。

Spring Framework

仿牛客网项目实战3:Spring入门_spring_02

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容器实现的关键,本质上就是工厂。

仿牛客网项目实战3:Spring入门_后端_03

bean与bean之间的关联是在配置中体现的,降低了耦合度。

仿牛客网项目实战3:Spring入门_java_04

@springbootapplication这个注解是由其他注解组成的。

仿牛客网项目实战3:Spring入门_spring_05

按住control点进去可以发现构成这个注解的注解有哪些。

@componentscan就是配置类扫描,哪些类能被扫描呢,就是需要@Controller和@Service、@Repository等四个配置才能被自动扫描到。

如果是业务组件就需要@Service组件才能被扫描,如果是控制组件就需要@Controller。

【重要注解:①@controller(请求)、@Repository(数据库)、@Service(业务)和@Component(任意调用)可以使得spring容器扫描bean;可以直接使用application.getbean()的方式获得,也可以使用@Autowired依赖注入的方式;如果bean出现重名,可以使用name将其区分开,也可以使用@primary设置其优先级;默认创建的bean对象都是单例的,如果需要改变不是单例@singlone可以写成@prototype改变成多例的。】如何证明这个容器存在呢,可以这么证明:

仿牛客网项目实战3:Spring入门_依赖注入_06

这样子控制台可以看到输出了这个容器,是可见的,是存在的。那么如何运用这个容器去管理Bean呢?

现在写一个bean,现在假设要访问数据库,那么我建一个包专门用来管理访问数据库,这个包下建立接口等等。

仿牛客网项目实战3:Spring入门_java_07

接口不能直接用,还得加一个接口的实现类。

然后增加这个接口的具体实现方法。同时注意在类上加上注解,让程序自动扫描。

仿牛客网项目实战3:Spring入门_spring_08

然后就可以从容器中获取到这个Bean了。

仿牛客网项目实战3:Spring入门_依赖注入_09

这样就成功获取到了Bean,并得到了结果。

这样做的好处:再次通过一个实例来观察。

仿牛客网项目实战3:Spring入门_后端_10

做完上面这一张图需要注意加注解,同时这个时候因为我们是getBean去获取,那么此时满足条件的就有两个了,Bean容器就不知道给你哪一个了。

然后这个时候只需要在希望得到的Bean加一个注解就可以优先得到了。

仿牛客网项目实战3:Spring入门_spring_11

调用的Bean是依赖的接口,不依赖本身,则是面向接口的思想,就比较方便,但是也可能会带来一个问题,如果某一块不想要MyBatis,那么就需要强制容器进行返回就可以了。

仿牛客网项目实战3:Spring入门_java_12

除了上面这个方法,还可以通过加前缀强制转型。

仿牛客网项目实战3:Spring入门_spring_13

现在如果该多了一个service层,那么可以如 下图一样进行添加。

现在希望容器管理这个Bean销毁和初始化那些方法,那么想要容器调用这些方法需要添加@PostConstruct方法就可以了。通常在构造器后进行调用。

仿牛客网项目实战3:Spring入门_spring_14

仿牛客网项目实战3:Spring入门_spring_15

现在在测试类进行测试演示。

仿牛客网项目实战3:Spring入门_java_16

然后可以发现在控制台打印了这些方法。

仿牛客网项目实战3:Spring入门_初始化_17

然后通过打印台可以看出,这些Bean都是实例化一次的,只实例一次的。

开始被实例、初始化,然后结束后销毁。

就算调用两次,控制台也是出来一次的。

可以看出是单例的。如果不希望是单例的,希望整个容器中有多个,那么就需要加一个注解。

仿牛客网项目实战3:Spring入门_依赖注入_18

这样每次访问该Bean的时候都会加一个实例。

但是通常情况下都是单例的情况。

  • 以上都是管理自己的Bean,那么如果想调用第三方的话,那么就需要自己写一个配置类,装配一个第三方的Bean。
  • 配置类可以建一个包 config包。

仿牛客网项目实战3:Spring入门_初始化_19

同时需要注意下图中的方法名就是Bean的名字。

仿牛客网项目实战3:Spring入门_java_20

这个时候也就说这个方法的返回类型将被装配到容器里进行反复运用。然后再 在测试类中进行测试,再添加一个测试方法。

先声明类型然后进行getBean就可以了。下图中调用这个对象去初始化一个当前时间。

仿牛客网项目实战3:Spring入门_初始化_21

仿牛客网项目实战3:Spring入门_spring_22

上述讲的都是主动调用容器的方法。

但是一般是自动注入容器等。接下来讲 依赖注入。只需要声明给当前的Bean注入Alpdao就可以了。

那么注入的话需要用到@Autowired注解。

然后加在一个成员变量之前。

那么就是说,希望容器把alphadao注入给这个属性,给我们直接使用就可以了。(DI依赖注入)

仿牛客网项目实战3:Spring入门_后端_23

发现可以打印出结果的。

仿牛客网项目实战3:Spring入门_后端_24

同理,alphaService也是可以的,SimpleDateFormat也是可以的。

仿牛客网项目实战3:Spring入门_后端_25

仿牛客网项目实战3:Spring入门_初始化_26

这个时候都取到了。

但如果想改注入的东西,比如说alphadao不要alphadao而是hibernate,那么就可以添加一个注释就可以了。(即忽视优先级)

仿牛客网项目实战3:Spring入门_spring_27

实际业务中:controller处理浏览器的请求,来调用service处理业务,然后service调用dao处理。彼此互相依赖的,他们的关系就可以通过依赖注入实现。

比如说现在需要注入alphadao给alphaserrvice。那么就可以在处理业务的时候调用service了。

仿牛客网项目实战3:Spring入门_spring_28

然后写一个方法模拟查询的业务就可以了。

仿牛客网项目实战3:Spring入门_初始化_29

然后再controller中将service注入给他,然后处理一个查询请求的方法就可以了。

仿牛客网项目实战3:Spring入门_后端_30

仿牛客网项目实战3:Spring入门_初始化_31

  • 整理一下:首先调用controller,然后controller调用service中的find方法,然后find方法中又调用alohadao的方法,然后就是这么实现的。通过这样的例子理解DI的概念。
  • 通过容器统一的管理,降低Bean之间的耦合度。
  • (可以看到,在controller层中,我们调用了service层的代码,却不是直接new一个对象,而是用@Autowired注解,并在类上使用了@Controller注解,这些注解帮助我们自动配置并注入对象,我们在使用时就不用new对象,从而减少代码耦合。)

网友评论