(面试)Spring的基础知识

目录

1.定义

2.Spring具备的功能

3. Spring具体的实现技术(DI:注入依赖)

4.IOC和DI的区别

5.Spring的创建 

6.Spring对象的存储

7.从Spring当中读取Bean对象

8.Spring更简单的读取

 9.如何将一个类型多次放入Bean对象中

 10.更简单的取对象(获取Bean对象)注入的方式

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 注 ⼊和属性注⼊,不能⽤于构造函数注⼊。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值