spring注解思考

spring bean是什么

在 Spring 中,构成应用程序*主干*并由*Spring IoC容器*管理的*对象*称为*bean*。bean是一个由Spring IoC容器实例化、组装和管理的对象。

1、bean是对象,一个或多个不限定

2、bean由spring的ioc管理

3、我们的应用程序由一个个bean构成

bean规范

  1. 所有属性为private
  2. 提供默认构造方法
  3. 提供getter和setter
  4. 实现serializable接口 https://www.jianshu.com/p/4935a87976e5

产生bean

  1. @Component
  2. @Repository
  3. @Controller
  4. @Service
  5. @Configration
    前五种只能对类使用。
  6. @Bean (特殊,可对方法注解。@Bean注解需在上方五个注解的类中才生效)

DIP、IoC、DI以及IoC容器

https://www.cnblogs.com/liuhaorain/p/3747470.html

依赖倒置原则(DIP):

高层模块定义接口,低层模块负责实现

高层模块(has-A)不应依赖于低层模块,两者应该依赖于抽象。

​ --在层之间加入抽象接口类,低层模块依赖于高层的抽象接口

抽象不应该依赖于细节,细节应该依赖于抽象。

​ --业务。低层叫细节,低层模块的实现必须符合高层定义的接口标准

控制反转(IoC):

https://www.zhihu.com/question/23277575/answer/169698662

IoC就是一个对象定义其依赖关系而不创建它们的过程

其实就是DIP的实现,IoC则是一种 软件设计模式,它告诉你应该如何做,来解除相互依赖模块的耦合

控制反转(IoC),它为相互依赖的组件提供抽象,将依赖(低层模块)对象的获得交给第三方(系统)来控制即依赖对象不在被依赖模块的类中直接通过new来获取

软件设计

软件设计原则:原则为我们提供指南,它告诉我们什么是对的,什么是错的。它不会告诉我们如何解决问题。它仅仅给出一些准则,以便我们可以设计好的软件,避免不良的设计。一些常见的原则,比如DRY、OCP、DIP等。

软件设计模式:模式是在软件开发过程中总结得出的一些可重用的解决方案,它能解决一些实际的问题。一些常见的模式,比如工厂模式、单例模式等等。

DI(依赖注入)

说白了:利用反射机制为类的属性赋值的操作

IoC容器

https://blog.csdn.net/programmer_at/article/details/82389221

我们自己手动创建一个车instance的时候,是从底层往上层new的:

每一个类的构造函数都直接调用了底层代码的构造函数。这个过程中,我们需要了解整个Car/Framework/Bottom/Tire类构造函数是怎么定义的,才能一步一步new/注入。底层的改动都会牵动所有上层的改动。如果每次修改一个类,我们都要修改所有以它作为依赖的类,那软件的维护成本就太高了。

而IoC Container在进行这个工作的时候是反过来的,它先从最上层开始往下找依赖关系,到达最底层之后再往上一步一步new(有点像深度优先遍历)。所谓依赖注入,就是把底层类作为参数传入上层类,实现上层类对下层类的“控制”。

这里IoC Container可以直接隐藏具体的创建实例的细节,在我们来看它就像一个工厂:

我们就像是工厂的客户。我们只需要向工厂请求一个Car实例,然后它就给我们按照Config创建了一个Car实例。我们完全不用管这个Car实例是怎么一步一步被创建出来。


注解

Bean和@Bean https://www.cnblogs.com/bossen/p/5824067.html

注解分为两大类

一类是使用Bean

即是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean;

一类是注册Bean

@Component , @Repository , @ Controller , @Service , @Configration这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装。

@Bean是啥

@Bean明确地指示了一种方法,什么方法呢——产生一个bean的方法,并且交给Spring容器管理;

从这我们就明白了为啥@Bean是放在方法的注释上了,因为它很明确地告诉被注释的方法,你给我产生一个Bean,然后交给Spring容器,剩下的你就别管了

@Bean 用在方法上,告诉Spring容器,你可以从下面这个方法中拿到一个Bean


Dao层接口??

mybatis通过JDK的动态代理方式,在启动加载配置文件时,根据配置mapper的xml去生成Dao的实现。

@Repository注解的作用

https://blog.csdn.net/wqh0830/article/details/96109587

https://www.cnblogs.com/xinghaonan/p/12005401.html

Mybatis Mapper动态代理方法 即 只写Dao接口 不写Dao的实现类

https://blog.csdn.net/mxljiayou/article/details/52523263?t=1482072473653

https://blog.csdn.net/java280580332/article/details/72123890?locationNum=7&fps=1

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.itheima.dao"/>
</bean>
镜花水月
原文地址:https://www.cnblogs.com/fengbingshui/p/13586732.html