创建bean有三种方式,创建静态工厂,实例工厂,构造器,这三种有什么区别

1.Spring 创建 bean

主要过程就是创建一个xml文件,然后通过这个xml文件设置 bean 组件的初始值 , 在 代码中通过 反射的方式获取这个xml 配置文件 , 好处就是这样子只需修改 xml 文件 ,而不必去修改代码了,坏处就是,当你的项目大的时候,xml配置文件过多,显得臃肿,不利于对象的管理,因为就是通过配置这个bean直接获取他的实例嘛,直白点就是 我们现在就是把对象创建的过程交给了spring 容器 ,直接获取他的实例就行了,而不必去管他怎么创建的了。

2.使用静态工厂、实例工厂、构造创建

        首先创建的结果都是一样的,加载时机都是加载配置文件的时候就已经创建了实例,所以主要的区别就是创建方式的不同;

        默认的无参构造,是通过把指定的类交给 Spring 自带的工厂 BeanFactory管理;

        静态工厂,工厂本身不用创建工厂对象,通过静态方法调用;通过静态工厂创建bean,就是把静态工厂交给Spring管理,然后让Spring去调用静态工厂中创建对象的静态方法。适用第三方的jar包没有构造方法,可能是人家private了,你就不能使用构造创建,这时候就只能使用他提供的静态方法创建,同时,可以把第三方jar里面的这个类交由spring来管理,因为Spring这种方式创建对象是通过反射创建的,反射可以设置accessible为true,这样就可以绕开权限机制创建对象了,比如private权限不能创建对象,但是设置这个之后就可以创建对象了,就可以使用Spring提供的静态工厂创建实例的配置。

        实例工厂,工厂本身需要创建工厂对象,需要先new一个工厂实例,所以就是通过实例工厂创建bean,就是把静态工厂交给Spring管理,同时创建实例的过程也交给Spring管理,就是在使用getBean方法的时候,Spring帮你搞了创建实例工厂对象了。整合没有与SPring整合过的工厂类,使用这种方式,我们自己用代码管理,如Spring整合Hibernate就是通过这种方式实现的。

总结:简单来说,主要还是用构造创建比较多

下面的注解yyds

使用 @Component(标记组件),@Service(标记服务层),@Repository标记实体类),@Controller (标记 Web 组件)

Controller是sping MVC的 五大组件之一 ,分别是 - - - >

(1)DispatcherServlet 这个是整个spring mvc的入口,当前端 view 层将请求发到后台后,会让DispatcherServlet 进行请求分发,也就是像是指挥一样,指挥spring应该把前端的请求发到哪个Controller处理。

(2)HandlerMapping, 这个就是具体负责请求派发的,也就是DispatcherServlet会找一个bean,问他应该把请求交给哪个控制器,这个bean就是 HandlerMapping。

(3)Controller 真正的处理器,处理前端的请求的,应该很熟了。

(4)ModelAndView 封装模型信息和视图信息的 ,Model就是你要带给前端的数据 ,View 就是你要返回的视图,比如一个index页面。如果要返回 Json 格式的数据,应该使用@RestController注解 加在类上 ,或者 @ResponseBody 加在方法上,自动将返回的数据转成Json,这个用的比较多,因为现在的项目一般都是前后端分离的了,前后端交互一般使用Json格式的数据。

(5)ViewResolver 视图处理器 最终定位页面的,就是去找这个Controller指定的页面在哪,返回一个页面给前端)

总结:这几个注解都是定义bean的,就是会把注解的地方自动为你生成一个bean,默认都是单例模式的,所以要注意不要有重复名字,不让会提示你已经有重复的名字了,一般的bug就是,你引入的依赖,就是他们是不同包,实现不同的功能的,但是他们如果都有一个相同的bean的话,就会冲突了,报错,这个就比较经常遇见。

        使用 @Bean 注解 ,标记这是一个Bean ,简单快捷 ,常使用的一种方式了,配合 @Configuration 使用 , @Configuration 放在类上,标记这是一个 Spring boot 配置类 ,会自动扫描类中有@Bean注解的方法,把他加入到Spring容器中,自动生成对象。

猜你喜欢

转载自blog.csdn.net/LegendaryChen/article/details/127054479