目录
11、 @Resource和@Autowired有什么区别?
1.定义
Spring指的是Spring Framework,是一个开源框架,支持广泛的应用场景,Spring是包含了众多工具方法的IOC容器。
(1)容器:List/Map(数据存储的容器) tomcat(是一个Web容器)
(2)IOC:指的是控制反转(对象的生命周期控制权反转给别人了),告诉别人我只是需要一个这个样对象,那么我不关注它是什么样,要的是最终的形态
(3)IOC的优点:降低代码的耦合性
例如:A类引用B类,B类引用C类,C类引用D类,我们需要先new一个对象,如果此时我们的构造方法发生改变,那么所有的类都需要改变。如果说此时控制反转,那么执行顺序就会相反。
2.Spring具备的功能
- 将对象存到Spring当中
- 将对象从容器中取出来
3. Spring具体的实现技术(DI:注入依赖)
定义:在程序运行期间,动态的将某个对象引入到当前类的机制,叫做依赖注入
4.IOC和DI的区别
- 广义上:IOC等于DI,从不同的维度来描述同一个问题
- 狭义上: IOC是一个设计思想,DI是一个具体的实现技术
5.Spring的创建
(1)创建一个Maven项目
(2)输入名称
(3)将spring框架加入当前项目 spring-beans和spring-context
dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
(4)创建一个普通类和main方法运行spring框架
6.Spring对象的存储
(1)创建一个Bean对象
(2)将Bean对象注册到容器中,在resourses里面新增一个spring-config.xml的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
(3)将Bean对象配置到spring的配置文件中 【id(给Bean起的别名,不可以重复),class(对象本身,包名+类名)均需要修改】,这种方式存储使用太麻烦,开发量更大
<bean id="user" class="com.bit.User"></bean>
7.从Spring当中读取Bean对象
(1)先得到spring对象
获取Spring上下文两个之间的区别:BeanFactory 和 ApplicationContext
相同点:1.都可以得到Spring的上下文对象
2.都是来自Spring的顶级接口
不同点:1.其中 BeanFactory 提供了基础的访问容器的能⼒,⽽ ApplicationContext 属于 BeanFactory 的⼦类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性, 还添加了对国际化⽀持、资源访问⽀持、以及事件传播等⽅⾯的⽀持。
2.ApplicationContext 是⼀次性加载,并初始化所有的 Bean 对象,⽽ BeanFactory 是需要那个才去加载那个,因此更加轻量
(2)从Spring对象当中取出Bean对象
获取bean的方式:
- 根据id获取Bean对象
- 根据类型进行查找,获取到对象(当类型一致的时候会出现问题)
(3)使用Bean(可选的)
8.Spring更简单的读取
存Bean对象
(1)前置工作:设置扫描路径
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:content="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/contex
t/spring-context.xsd">
<content:compoent-scan base-package="com.bit.service"></content:compoent-scan>
</beans>
(2)添加注解存储Bean对象在Spring中
类注解:@Controller(控制器) @Service(服务) @Repository(仓库) @Component(组件) @Configuration(配置)
方法注解:@Bean(将当前修饰方法的返回对象存储到Spring中)
5大类注解之间的关系?
- @Controller(控制器):归属于用户逻辑层,用来控制用户的行为,它用来检查用户参数的有效性
- @Service(服务层):调用持久化类来实现相应的功能,不是直接和数据库相交互,它类似于控制中心
- @Repository(持久层):直接和数据库交互,每一个表都会对应一个Repository
- @Configuration(配置层):用来配置当前项目的一些信息
- @Component(组件):归属于公共工具类,提供某些工具方法
- @Bean需要配置5大类注解一起使用,否则不会生效
注意:@Component从逻辑上讲,是除了@Component之外的类的所有父类,他们几个是他的父类
@Controller
重点 从spring取对象时候的用法:(当使用5大类注解的时候,默认情况是首字母小写)
1.如果类名首字母小写,和首字母大写获取方式一样,都使用的是将类名首字母小写的方式来获取对象
2.如果首字母和第二个字母全是大写,直接使用原类名
3.当项目中没有目录的时候,怎样去取Bean对象(在配置文件里面直接用“* *”)来代替包路径
9.如何将一个类型多次放入Bean对象中
注意:当给@Bean方法名设置了属性,不能使用原方法名获取对象,只能使用设置的名称才能获取。
10.更简单的取对象(获取Bean对象)注入的方式
(1)属性注入
优点:比较简单
缺点:不能注入final对象(不可变的对象要不直接赋值,要不在构造方法里面赋值)
通用性问题: 使用@Autowired只适用于IOC容器
设计原则:更容易违背单一设计原则,针对类来说
(2)Setter注入
优点:更加符合单一设计原则(set只针对一个属性),写法比属性注入复杂,针对方法角度来说
缺点:不能注入final修饰的对象
注入对象可以被修改
(3)构造方法注入(Spring 4.x之后更加推荐)
如果有多个构造方法那就不可以省略@Autowired
优点:可以注入一个不可变的对象
注入对象不会被修改(1.可注入一个不可变对象 2.构造方法注入随类启动只执行一次)
注入对象会被完全初始化(使用构造方法带来的优点)
通用性更好
缺点:没有属性注入实现简单
11、 @Resource和@Autowired有什么区别?
- 相同点:都实现属性注入
- 出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
- 使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如 name 设置,根据名称获取 Bean。
- @Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注 ⼊和属性注⼊,不能⽤于构造函数注⼊。