Java框架学习--Spring

1.Spring概念【托管很多对象的框架】

一个包含了众多工具方法的IoC容器

1.1 什么是容器?

    容器是用来容纳各种物品的(基本)装置。--来自百度百科

之前常见的容器有:

      List/Map-》数据存储容器

      Tomcat-》Web容器

1.2什么是IoC?

IoC=Inversion of Control翻译成中文就是“控制反转”的意思,也就是说Spring是一个“控制反转”的容器。

控制反转:对象的创建权反转给别人了

    比如:

    创建一个类,A类引用B类,B类引用C类,C类引用D类的时候直接在构造函数里面new,

会有一个问题,当一个构造方法发生变化的时候,整个调用链都要发生变化,不在new了,

而是把当前的对象传入进来,这个时候虽然整个调用链还是A调用B,B类引用C类,C类引用D类,但是当D发生变化的时候,CBA不需要进行代码修改,从而解决了代码的耦合性,也就是IOC

降低代码的耦合性。

基本功能:

        1.将对象存入容器。        

        2.从容器中取出对象。

1.3 DI概念说明

    DI=Dependency Injection,依赖注入。所谓以来注入就是由IoC容器在运行期间,动态的将某种以来关系注入到对象之中。所以,以来注入和控制反转是从不同的角度描述同一间事情,就是指通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦。

  从广义上来说IoC=DI,从不同维度来描述同一个问题。IoC是设计思想,DI是具体实现。

2.Spring概念【托管很多对象的框架】【单例+懒汉】

      1.创建maven项目

      2.添加Spring框架依赖(spring-context,spring-beans)

      3.创建启动类

2.1 Spring对象的存储

       1.先创建Bean对象

        2.将对象存入到bean中

        (a)在resources下创建一个spring配置文件

        (b)将bean对象配置到spring配置文件中

        3.从spring中读取到Bean对象

        (a)根据名称获取Bean

          (b)根据Bean类型获取Bean【容易出错:当Spring中存在相同的对象时,使用类型来获取Bean就会报错】

        (c)根据Bean名称+Bean类型获取Bean对象

获取Spring对象的两种方式:ApplicationContext和BeanFactory

相同点:

  • 都可以得到Spring上下文对象
  • 都是来自Spring的顶级接口

不同点:

继承关系和功能:ApplicationContext属于BeanFactory的子类:BeanFactory只有最基础访问Bean的能力,而ApplicationContext除了拥有BeanFactory功能之外,还包含了更多的功能:如国际化支持、资源访问、事件传播等。

ApplicationContext是一次性加载并初始化所有的Bean对象,所以在后面访问Bean对象时会很快。而BeanFactory是需要某个Bean对象时,采取加载Bean对象,所以他在执行Bean获取时,比较慢。

更加简单的讲对象存储到Spring中

3. 五大类注解

@Controller:控制器

@service:服务

@Respository:仓库

@Component:组件

@Configuration:配置

4.方法注解:@Bean-》将当前修饰方法的方法对象存储到Spring当中。

约定>配置

1.如果类名首字母是小写,要怎么从Spring中获取Bean?

    和首字母是大写的是一致的,都是用的将类名首字母小写的方式来获取对象

2.如果首字母和第二字母都是大写,会怎么样?

    当使用默认规则,首字母小写获取Bean对象时,会失败,正确获取Bean的方式是使用原类名,就能成功获取到了

3.项目中没有目录,所有的类都写在java根路径下,怎么存取Bean对象?

最佳方案:给项目创建合适的路径【配置根路径**加载比较慢,因为配置了根路径下所有的】

结论:当使用5大类注解的时,默认情况下获取Bean对象,只需要将类名的首字母小写即可;然而当Bean对象首字母和第二个字母都是大写的时候,此时需要使用原类名才能正确获取到Bean对象。

5.为什么需要五个类注解?

a)通过类注解可以了解当前类的用途(看到车牌 陕A 就知道这是西安的车一样)

b)功能由细微的不同

五大类注解的用途

程序的工程分层,调用流程如下所示:

Java框架学习--Spring_第1张图片

1.@Controller(控制器):表示的是业务逻辑层,用来控制用户的行为,它用来检查用户此参数的有效性。

2.@Service(服务):归属于服务层,调用持久化类实现相应的功能。【不直接和数据库交互的,类似于控制中心】

3.@Repository(仓库):归属于持久层,是直接和数据库进行交互的。通常每一个表都会对应一个@Repository

4.@Configuration(配置):归属于配置层,是用来配置当前项目的一些信息。

5.Component(组件):归属于公共工具类。提供某些公共方法。

6.五大类注解的关系

@Component是除了@Component的所有类的父类。

存对象到Spring中实现方式2:

使用@Bean方法注解:将返回的对象存储到Spring中。

注意事项:@Bean注解一定要配合5大类注解一块使用,否则是无效的注解。

当给@Bean设置了name属性之后,使用原方法名就不能获取到对象了,只能使用设置的方法名

注入的三种方式:

@Autowired、@Resource

1.属性注入

优点:实现简单

缺点:

  • 不能注入不可变(final)的对象、
  • 只适用IoC容器、
  • 更容易违背单一设计原则

2.setter方法注入

优点:更加符合单一设计原则

缺点:

  • 不能注入不可变(final)的对象、
  • 注入对象可被修改【set方法是普通set方阿飞,可以被重复调用,在调用的时候就存在被修改的风险】

3.构造方法注入【当一个类中只有一个构造方法的手,可以省略@Autowired】

优点:

  • 可以注入不可变的对象
  • 注入的对象不会被修改

       a)加了final修饰符

       b)构造方法是随着类加载只执行一次的(不像set有可能执行多次被修改的)

  • 注入的对象会被完全初始化【使用构造方法带来的优点】
  • 通用性更好

缺点:没有属性注入简单

小结:日常开发中,使用属性注入实现更简单的读取Bean,依然是主流的实现方式。

@Autowired、@Resource的区别?

相同点:都是用来实现依赖注入的

不同点:

1.功能支持不同:

@Autowired支持属性注入,setter注入、构造方法注入

@Resource支持属性注入和setter注入,但不支持构造方法注入

2.出身不同:@Autowired来自Spring框架,@Resource来自JDK

3.参数支持不同:@Resource支持更多的参数设置,而@Autowired只支持required参数

你可能感兴趣的:(spring,java,学习)