spring讲解四:spring用户实现ioc提供的三种编码方式? 为什么提供这三种编码方式 ?

这里要说的spring,是spring framework。

 

我们都知道,spring framework的核心,无非就是IOC , AOP , DI

所白了,IOC就是为DI准备的。

而我们使用spring,其实就是使用它的核心功能IOC(控制反转),将对象的创建权利,交给spring容器,我们可以直接拿到Bean进行编码。

 

而spring在发展过程中,也不是一蹴而就的。

最开始,他们就想到做IOC功能,他们解决的是,如何将对象的创建权利交给spring容器(这里多一句嘴:为什么spring要拿到对象的创建权利? 当然是为了方便,更加智能,至于解耦合,不敢苟同,我们想想AOP功能,面向切面编程,如果我们没有拿到对象的创建权利,我们如何使用AOP,如何控制事务?特别是如何精确的控制事务,所以,IOC的功能,也算是为AOP做铺垫,spring就是要拿到所有对象,然后再根据spring的思路,进行面向切面编程)

 

我说了,spring的发展不是一蹴而就的。

最开始,只想着做功能,所以没想这么多,那时候,就开启了xml配置的恶魔之路。

我们应该都看到过类似这样的配置吧(作用是:将对象,属性,字符串,数组等,都用xml的方式表现出来)

    <!--从代码中,可以看出OneController类,依赖了OneService接口,并且给出了set方法-->
    <bean id="oneController" class="com.wqm.controller.OneController">
        <!--set方法使用property-->
        <property name="oneService" ref="oneServiceImpl"></property>
        <!-- 注入一个字符串 -->
        <property name="url" value="http://wwww.baidu.com"></property>
    </bean>

    <bean id="oneServiceImpl" class="com.wqm.service.impl.OneSerivceImpl"></bean>

没错,那时候,为了spring能管理所有对象,每个对象,我们都要这样配置,配置好了,spring扫描到之后,就把这些类放在spring的容器之中,然后完成他的IOC功能。

 

紧接着,不管是spring公司,还是外面的开发人员,都觉得xml太繁琐,太麻烦,就开始注解配置之路,这期间,是由xml到注解慢慢过渡的,所以spring提供了2种不同的方式,让spring管理对象

ClassPathXmlApplicationContext classPathXml = new ClassPathXmlApplicationContext("classpath:springioc.xml");
OneController oneController = (OneController) classPathXml.getBean("oneController");


还有种,是创建一个
AnnotationConfigApplicationContext对象

所以很多人,应该也使用过,xml搭配注解的方式开发。

比如:在springmvc.xml配置中有一段,配置注解驱动,意思就是,这个包下的所有类,我现在都要用spring管理,并且使用注解的方式注入,当然后面spring决定,开启包扫描后,就自动开启注解不需要<mvc:annotation-driven />这个配置了:

<!-- 配置包扫描器  ,扫描Controller层-->
<context:component-scan base-package="com.wqm.step.controller" />
	
<!-- 配置注解驱动 -->
<mvc:annotation-driven />

然后代码中,就开始使用 @Component @Controller  @Servcie @Repository 这些代替xml对bean的配置

@Autowired
private PersonService personService;

用这种方式调用

其实上面这个算是纯注解了。至少没有再编写对象之间关系的xml了。

 

当大家都使用这种方式,开发的不亦乐乎的时候,大家期待的纯注解开发也还没有开始使用的时候,springboot登场了。

目前,spring核心的核心,其实就是自动装配,目前自动装配已经抛弃了xml配置。

springboot就使用了自动装配并摒弃了所有的xml,将配置都写在了java代码中,并且springboot帮我们把很多配置,都配置好了。

 

自动装配好处:

(

自动装配有3种方式,下面只说两种,第三种我还没看过:

1. 通过类型自动装配

2. 通过名字自动装配

3. 通过构造方法自动装配

)

用xml的时候,要用控制反转的类,就要写在xml里面,现在直接用注解@Component、@Controller 、@Service 、@Repository 等等,并且使用了注解之后,spring自动为你,将类交给spring容器管理。

至于@Controller 、@Service 、@Repository这3个注解,目前意思跟@Component是一样的,spring官网说,未来可能会给他们增加新的功能,目前也只是看着更加清晰,明显。目前仅仅是为了,区分,某个类属于web层,或者逻辑层,或者数据获取层。

@Autowired、@Resource:这2个注解的作用:既然所有类要交给spring管理,那么我怎么管理呢? 如果有相同的类怎么办?你让我自动装配,我装配哪一个?所以出现了这两个注解,@Autowired是根据装配类的类型来装配,有相同的类型,我就报错。@Resource注解,我们自己指定一个名字,只要我们自定义名字的时候,没有重复,就可以自动装配了。也可以指定type,所以这个注解相对来说比较灵活。

突然想起前几天面试,我说我对spring比较熟悉,面试官就问我这个问题,@Autowired与@Resource的区别是什么 ?说实话,正常写代码,真的不需要@Resource,虽然用过但是没有深究过。

这里也就引出了一个问题,就算你看过spring源码,如果没有带着问题去看,那就仅仅是看过,不会理解到这么深,真问你的时候,只能再去看源码,然后测试得出结论。

想起来,真是脸红,我没回答上来,支支吾吾了半天,真是打脸我那句熟悉spring。

现在来说一下把:@Controller 、@Service 、@Component、@Repository 这些注解的作用都是让spring扫描到,并将扫描到的类放在spring容器中去被spring管理,同时spring自己为被管理到的类,生成类型和名字,方便开发人员获取到该类,要知道开发中,我们通常一个Service的接口,就一个实现类,通常是不可能有两个实现。所以上面那些注解都是通过类类型来为名字标识,存储到spring容器中去的,当然也存储了名字。然后要用到这些类的时候,使用@Autowired很方便,直接通过类的类型名去取这个类的对象的。

@Resource用到的情况,其实就相当于,同一个Service接口,被实现了两次,就有两个相同的类型。如果还用@Autowired来注入对象的话,spring就不明白,取两个对象中的哪一个,所以就有了@Resource(name = "xxxxxxImpl"),来指定取哪一个对象,当然这个注解也支持根据类类型装配,@Resource的使用写法如下:

@Resource(type = XxxxServiceImpl.class)
private XxxxService xxxxService;

当然就算有两个实现类,还可以用@Autowired,因为还有一个写法,指定用名字来取:

@Autowired
@Qualifier("xxxxxxImpl") // 根据名字来取
private XxxxService xxxxService;  这种组合来取对象。

所以结论是:@Autowired是通过类型自动装配,@Resource(name=“xxx”)是通过名字自动装配,也支持类类型装配,并且@Autowired是spring提供的注解,@Resource是jdk1.6,java提供支持的注解。

 

这里再简单的说一下,自动装配,和springboot的好处:

springboot做了很多配置,但是有些功能,我们也不需要呀,所以自动装配的优点就体现出来了,自动装配的使用,就是springboot帮我们把需要的配置,都写好了,我们如果要用,只需要一个注解,就直接使用,大大的减少了开发时间,并且还有一个好处:比如连接redis有些配置方式,redis公司改了,依赖更新,也不需要我们去再花时间学习,了解,更改配置,spring会自己去变更,我们只需要配置spring需要的url,账号,密码就好了,我们专注spring提供的接口就好了,不需要再去管什么,redis,mysql,mq等各种各样的组件。

 

再则,IOC功能需要被用起来,要么使用xml的方式,要么使用java类的方式,而spring的自动装配把xml的方式取消了。

所以就只剩,javaConfig方式了。

 

所以现在就是JavaConfig + 注解的方式。

 

总结:IOC是spring的核心功能之一。

要使用IOC功能,spring公司代码更新很多次,但提供给用户的使用方式都离不开:

1. xml配置,管理对象

2. xml配置+开启注解,管理对象

3. javaConfig配置+注解,管理对象

 

目前springboot只使用javaConfig + 注解的方式 完成ioc的使用,xml被淘汰了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值