Spring是轻量级的开源的JavaEE框架,可以解决企业应用开发的复杂性
Spring有两个核心部分 :IOC和AOP
IOC:(依赖注入——降低耦合度)控制反转 把创建对象过程交给Spring进行管理
AOP:面向切面,不修改源代码进行功能增强
dao层主要做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此
service层主要负责业务模块的应用逻辑应用设计
Controller层负责具体的业务模块流程的控制 ,在此层要调用service层的接口来控制业务流程
Spring的核心就是提供了一个IoC容器,它可以管理所有轻量级JavaBean组件,提供的底层服务包括组件的生命周期管理、配置和组装服务、AOP支持,以及建立在AOP基础上的声明式事务服务等。

什么是IOC

控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理
使用 IOC 目的:为了耦合度降低

IOC的底层原理

IOC的底层原理xml解析、工厂模式、反射

画图讲解IOC的底层实现原理

为什么IOC可以极大的降低耦合度?

解耦:更改某一层代码,不会影响其它层的代码,spring这样的框架,是面向接口编程的,表示层调用控制层,控制层调用业务层,业务层调用数据访问层

原始版本:在UserService中调用UserDao方法
在这里插入图片描述
工厂模式:
在这里插入图片描述
引入IOC:
在这里插入图片描述

IOC 降低耦合度,通过XML配置文件,配置创建的对象
通过反射创建对象

IOC操作Bean管理( xml 配置文件方式)

Bean管理指的是两个操作
(1)Spring创建对象
(2)Spring注入属性
Bean 管理操作有两种方式
(1)基于 xml 配置文件方式实现
(2)基于注解方式实现

基于xml方式创建对象

<beans>
    <bean id="dataSource" class="HikariDataSource" />
    <bean id="bookService" class="BookService">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <bean id="userService" class="UserService">
        <property name="dataSource" ref="dataSource" />
    </bean>
</beans>

上面xml配置文件指示IOC容器创建3个JavaBean组件,并把把id为dataSource的组件通过属性dataSource(即调用setDataSource()方法)注入到另外两个组件中。

注意:在Spring的IOC容器中,我们把所有组件统称为JavaBean,即配置一个组件就是配置一个Bean。

(1)在 bean 标签有很多属性,介绍常用的属性 * id 属性:唯一标识 * class 属性:类全路径(包类路径)
)创建对象时候,默认也是执行无参数构造方法完成对象创建

基于 xml 方式注入属性

依赖注入就是注入属性

第一种注入方式:使用 set 方法进行注入

在xml配置文件中配置对象创建,配置属性注入

name:类里面属性名称
value:向属性中注入的值
在这里插入图片描述

第二种注入方式:使用有参数构造进行注入

在这里插入图片描述
Spring的IoC容器同时支持属性注入构造方法注入,并允许混合使用。

总结

在设计上,Spring的IoC容器是一个高度可扩展的无侵入容器。
所谓无侵入,是指应用程序的组件无需实现Spring的特定接口,或者说,组件根本不知道自己在Spring的容器中运行。这种无侵入的设计有以下好处:
(1)应用程序组件既可以在Spring的IoC容器中运行,也可以自己编写代码自行组装配置;
(2)测试的时候并不依赖Spring容器,可单独进行测试,大大提高了开发效率。

装配Bean

xml注入外部bean

在service里面注入dao
在这里插入图片描述
每个<bean …>都有一个id标识,相当于Bean的唯一ID;
通过<property name="..." ref="..." />注入了另一个Bean;

xml注入内部Bean

在这里插入图片描述
在员工里注入部门类
部门类:
在这里插入图片描述
员工类:

main 方法

Spring容器通过读取XMl文件后使用反射完成
xml

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test" />
    <property name="username" value="root" />
    <property name="password" value="password" />
    <property name="maximumPoolSize" value="10" />
    <property name="autoCommit" value="true" />
</bean>

创建一个Spring的IOC容器实例,加载配置文件,让Spring容器为我们创建并配置好Bean

ApplicationContext context = new ClassPathXmlApplicationContext("application.xml"

从Spring容器中读取装备好的Bean并调用它

// 获取Bean:
UserService userService = context.getBean(UserService.class);
// 正常调用:
User user = userService.login("bob@example.com", "password");

完整的main()方法

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        UserService userService = context.getBean(UserService.class);
        User user = userService.login("bob@example.com", "password");
        System.out.println(user.getName());
    }
}

IOC容器BeanFactory

观察main代码
创建Spring容器的代码:

ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");

Spring容器就是ApplicationContext,他就是接口,里面有很多实现类,这里我们选择ClassPathXmlApplicationContext,表示他会自动从classpath中查找指定的xml配置文件
获取ApplicationContext ,我们就获得了IOC容器的引用,从ApplicationContext中我们可以跟去Bean的ID获取Bean,但更多的时候我们根据Bean的类型获取Bean的引用:

UserService userService = context.getBean(UserService.class);

Spring中还提供另一种IOC容器BeanFactory

BeanFactory factory = new XmlBeanFactory(new ClassPathResource("application.xml"));
MailService mailService = factory.getBean(MailService.class);

BeanFactory和ApplicationContext的区别在于,BeanFactory的实现是按需创建,即第一次获取Bean时才创建这个Bean,而ApplicationContext会一次性创建所有的Bean
实际上,ApplicationContext接口是从BeanFactory接口继承而来的,并且,ApplicationContext提供了一些额外的功能,包括国际化支持、事件和通知机制等。通常情况下,我们总是使用ApplicationContext,很少会考虑使用BeanFactory。

小结

Spring的IoC容器接口是ApplicationContext,并提供了多种实现类;
通过XML配置文件创建IoC容器时,使ClassPathXmlApplicationContext
持有IoC容器后,通过getBean()方法获取Bean的引用。

Bean的生命周期

生命周期:从对象创建到销毁的过程
2、bean 生命周期

  • 通过构造器创建 bean 实例(无参数构造)
  • 为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
  • 调用 bean 的初始化的方法(需要进行配置初始化的方法)
  • bean 可以使用了(对象获取到了)
  • 当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法
    在这里插入图片描述
    配置后置处理器 Bean的生命周期一共有七步
    在这里插入图片描述
    在初始化前后添加第3步和第7步
  • 通过构造器构建bean实例(无参数构造)
  • bean的属性赋值(调用set方法)
  • 把bean实例传递bean后置处理器的方法postProcessBeforeInitialization
  • 调用bean的初始化方法(需要进行配置初始化方法)
  • 把bean实例传递bean后置处理器的方法postProcessAfterInitialization
  • bean可以使用了(对象获取到了)
  • 当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法)

IOC操作Bean管理(基于注解方式)

使用XML配置的优点是所有的Bean都能一目了然地列出来,并通过配置注入能直观地看到每个Bean的依赖。
它的缺点是写起来非常繁琐,每增加一个组件,就必须把新的Bean配置到XML中
基于注解的配置:可以完全不需要XML,让Spring自动扫描Bean并组装它们。

Spring中针对Bean管理中创建对象提供注解

@Component @Service @Controller @Repository
上面四个注解功能是一样的,都可以用来创建Bean实例

实现步骤

第一步:引入依赖
在这里插入图片描述
第二步:开启组件扫描
在这里插入图片描述
第三步:
创建类 在类上面添加创建对象注解
注解里面是value属性值可以忽略不写 默认值是类名称,首字母小写
在这里插入图片描述
第四步:开启组件扫描细节配置
在这里插入图片描述
第五步:基于注解方式实现属性注入
@Autowired 创建对象注入属性
在这里插入图片描述
@Qualifier根据名称进行注入与@AutonWired一起使用

在这里插入图片描述
在这里插入图片描述

完全注解开发例子

注解使用@Autowired
就相当于把指定类型的Bean注入到指定的字段中。和XML配置相比,@Autowired大幅简化了注入,因为它不但可以写在set()方法上,还可以直接写在字段上,甚至可以写在构造方法中:

@Component
public class UserService {
    MailService mailService;

    public UserService(@Autowired MailService mailService) {
        this.mailService = mailService;
    }
    ...
}

创建配置类

@Configuration
@ComponentScan
public class AppConfig {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        UserService userService = context.getBean(UserService.class);
        User user = userService.login("bob@example.com", "password");
        System.out.println(user.getName());
    }
}

除了main()方法外,AppConfig标注了ComponentScan,它告诉容器,自动搜索当前类所在的包以及子包,把所有标注为@Component的Bean自动创建出来,并根据@Autowired进行装配

总结:

每个Bean被标注为@Component并正确使用@Autowired注入,@Autowired就相当于把指定类型的Bean注入到指定的字段中
配置类被标注为@Configuration@ComponentScan

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐