目录
前言
了解框架的概念
Spring框架
关于Spring
在Maven中使用Spring
Spring怎么管理对象
spring怎么创建对象
通过@Bean注解创建对象
通过组件扫描创建对象
关于@ComponentScan("xxxxxx")
Spring Bean的作用域
自动装配技术
什么是自动装配
补充
IoC与DI
@Qualifier注解
@Resource注解
未提到的内容
结语
前言
学过Java的小伙伴都知道,Spring框架在Java中已经不是一个简单的框架那么简单了,它是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力。关于其历史,博主不再介绍,今天这篇博客的作用是帮助初学者认识这个框架,了解它的基本功能,这对后续了解SSM框架乃至微服务的开发都有极其重要的作用。
了解框架的概念
框架( Framework )是构成一类特定软件可复用设计的一组相互协作的类。框架规定了你的应用的体系结构。它定义了整体结构,类和对象的分割,各部分的主要责任,类和对象怎么协作,以及控制流程。框架预定义了这些设计参数,以便于应用设计者或实现者能集中精力于应用本身的特定细节。
你可以将框架理解为现实生活中的“毛胚房”,它已经完成了住房最基础 部分的设计,例如打地基、设计住房的基本格局、预留电路、水路的线路 接入等……当你使用一个框架时,就相当于得到了一间毛胚房,如果你想住进去,你需要做的事情主要是“装修”,把这个毛胚房加工成你希望的样子。
我们可以认为框架已经帮我们做好了基础的部分。框架对我们的帮助很大,但也因此对我们造成了一定的限制。因为需要遵守框架定下来的一些规则协议。所以在学医框架时,首先要做的就是掌握框架的使用方法,这样才能达到我们预期的目标,而关于实现原理这些,可以等到彻底掌握之后再去了解不迟。
Spring框架
Spring框架主要解决了创建对象、管理对象的问题。Spring框架的核心价值在于:开发者可以通过Spring框架提供的机制,将创建对象、管理对象的任务交给Spring来完成,而开发者不必在关注这个过程,只需要在需要创建对象的时候,通过Spring来获取即可。对了,框架我们也称之为容器,所以,Spring框架也称作Spring容器,当别人在谈到容器的时候,不至于不知道说的是什么。
Spring框架很好的支持了AOP,关于AOP,这是一块比较大比较复杂的内容,所以这里暂不多做介绍,将会在后期推出专门的博客来进行说明,本篇的意义在于让大家快速的了解Spring框架,为Java入门作基础。
关于Spring
public class UserMapper { //向用户表中中插入数据 public void insert() { } }
这是一个mapper类,作用是来操作操作sql来执行一些增删改查的命令的,假设我们要创建一个这样的对象:
UserMapper userMapper = new UserMapper();
只需要这么做就可以,但是在实际开发中,会存在类之间相互依赖的情况,一个对象可能需要被频繁创建,在客户端,我会声明一个全局变量,或者是属性,以方便在整个类中使用,在Java中我们当然希望也是这样的方式。事实上,你可以照猫画虎,也这样做,但是Java中提供了一种方式连对象初始化创建都不需要我们自己做,可以帮助我们大大提高开发的效率,而这,就是框架的好处。
比如:
public class UserController { public UserMapper userMapper; public void register() { userMapper.insert(); } }
在controller中,我们要在注册的时候使用前面的那个mapper,调用insert方法插入注册的用户数据 ,userMapper需要被new出来,我们先前说了,框架提供了便捷的方式帮助我们初始化。为什么要这么做呢?如果自行创建对象,当多个类都依赖UserMapper时,各自创建UserMapper对象, 违背了“只需要1个”的思想。
在开发中,有许多类型的对象、配置值都需要常驻内存、需要有唯一性,或都需要多处使用,自行维护这些对象或值是非常繁琐的,比如单例。通过 Spring框架可以极大的简化这些操作,曾经听别人说过:Spring框架这种自动创建对象的能力也是一种“单例”,此单例非彼单例,只思想上是单例,以后有机会再讲。
在Maven中使用Spring
当使用Spring时,我们一般使用maven工程,在pom文件中添加依赖如下:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.14</version> </dependency>
版本号可按需调整。推荐大家使用旧的版本,因为相对稳定一些。
Spring怎么管理对象
spring怎么创建对象
Spring管理对象需要先创建对象,然后spring才能获取到对象并进行管理;
Spring管理的对象,我们称为Spring Bean;
创建对象我们常用两种方式:
通过@Bean注解
通过组件扫描
不懂没关系,接下来我们分别来说说他们分别是什么。
通过@Bean注解创建对象
我们先创建一个类,比如路径如下:cn.codingfire.spring.SpringBeanPro
public class SpringBeanPro { }
在类中添加方法:
@Configuration public class SpringBeanPro { @Bean public Random random() { return new Random(); } }
可自定义一个类去返回一个对象,博主懒,通过Random来做。要注意的是,@Configuration注解必不可少, 方法上的@Bean注解也必不可少,不要问为什么,因为不这么做,无法达到效果,记住即可,关于这些注解的作用,其实很难描述清楚,很多注解在不同环境下语义是不一样的,但有时候,用什么注解都是一个效果,此处可不行啊,后续会出一篇注解大全来总结介绍Java中常用的注解,请大家暂时不要纠结这些注解。
本例中:
@Configuration添加在类的生明之前,表示此类是配置类,会自动执行配置类中的@Bean方法,并解读配置类上的其他注解。
@Bean添加在配置类中用于创建对象的方法之前,使得Spring框架自动调用次方法,并管理次方法饭蝴蝶结果,@Bean方法必须存在于@Configuration注解下的类中
接着,我们需要测试我们的类是否已经被spring管理,所以,需要来测试下:
让Spring先跑起来,这个代码很长了,看看:
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringBeanPro.class);
这玩意不需要纠结,它只是用于加载Spring配置,注意,要在构造方法中添加参数,即我们的类。
从Spring中获取对象
Random random = (Random) ac.getBean("random");
其实就是方法的名称,这里运用了反射机制,听过的大概知道原理,不懂的也不再额外介绍,嗯~大概就是通过字符串获取实体类或方法的一种机制。
输出测试,看看有没有获取到对象
System.out.println(random);
结束
ac.close();
以上代码,你需要知道的有三点:
getBean方法,次方法会被重载多次:
Object getBean(String beanName) 通过此方法,传入的beanName必须是有效的,否则将导致 NoSuchBeanDefinitionException
T getBean(Class<T> beanClass);使用此方法时,传入的类型在Spring中必须有且仅有1个对象,如果Spring容器中没 有匹配类型的对象,将导致NoSuchBeanDefinitionException,如果有2个或更多, 将导致NoUniqueBeanDefinitionException
T getBean(String beanName, Class<T> beanClass) ;此方法仍是根据传入的beanName获取对象,并且根据传入的beanClass进行类型转换
两个注解,缺一不可,有意思的是,@Configuration注解并不是必须的, 但@Bean方法的使用规范是将其声明在@Configuration类中
使用的@Bean注解可以传入String类型的参数,如果传入,则此注解对应的方法的返回结果的beanName就是@Bean注解中传入的String参数值,后续调用getBean() 方法时,如果需要传入beanName,就应该传入在@Bean注解中配置的String参数值,而不是方法名
@Configuration public class SpringBeanPro { @Bean("random") public Random xxxxx() { return new Random(); } }