Spring&Spring Boot

Spring

Spring七大模块

IOC理论推导

  • 控制反转,获取依赖对象的方式反转
  • 不用管理对象的创建,用提供接口的方式将主动权交给用户
  • 低耦合,更加专注在业务实现上
  • 依赖注入(DI)是实现IOC的一种方式
  • 本质利用set方法实现控制反转

IOC

  • 对象由Spring创建、管理和装配

bean标签

<bean id="mysqlImpl" class="com.beizi.dao.MysqlImpl">
  <property name="age" value="1" />
  <property name="userDao" ref="mysqlImpl" />
</bean>
  • id 代表新创建的对象
  • class指向已经存在的对象
  • property中的name代表属性
  • property中的value代表属性的值
  • property中的ref代表已经在bean文件声明过的引用对象

IOC创建对象

  • 默认使用无参构造方法创建对象!
  • 使用有参构造方式
    • 下标赋值
<bean>
  <constructor-arg index="0" value="aaa" />
</bean>

bean配置总结:

  • 在配置文件加载的时候,容器中管理的对象就已经初始化了

DI依赖注入

  • 依赖注入:Set注入
    • 依赖:bean对象的创建依赖于容器
    • bean对象中所有的属性,由容器注入
<bean id="address" class="com.beizi.Address"></bean>
<bean id="beanTest" class="com.beizi.Student">
  <!--普通方式注入-->
  <property name="name" value="mingzi" />
  <!--bean注入方式,ref-->
  <property name="address" ref="address" />
  <!--array-->
  <property name="books">
    <array>
      <value>book1</value>
      <value>book2</value>
    </array>
  </property>
  <!--list-->
  <property name="books">
    <list>
      <value>book1</value>
      <value>book2</value>
    </list>
  </property>
   <!--map-->
  <property name="card">
    <map>
      <entry key="cardname" value="123" />
    </map>
  </property>
</bean>

bean自动装配

  • 自动装配是Spring满足bean依赖一种方式
  • Spring会在上下文中自动寻找,并自动给bean装配属性

隐式的自动装配

<!--byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的beadid,需要保证bean的id唯一-->
<bean id="cat" class="com.beizi.pojo.Cat" />
<bean id="dog" class="com.beizi.pojo.Dog" />
<bean id="people" class="com.beizi.pojo.People" autowire="byName">
  <property name="name" value="121" />
  <!--<property id="cat" ref="Cat" />-->
  <!--<property id="dog" ref="Dog" />-->
</bean>

使用注解自动装配

  • @Autowired & @Resource
  • @Autowired,在属性上使用即可,也可以在set方法上使用,默认通过类型和byName去匹配
  • 开启注解的支持:<context:annotation-config />
  • @Qualifier(value = "111"),指定唯一的自动装配的id
  • @Resource 默认通过byName去匹配,找不到的话通过类型去匹配
<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd">
  <!--开启注解的支持-->
  <context:annotation-config />
  <bean id="cat" class="com.beizi.pojo.Cat" />
  <bean id="dog" class="com.beizi.pojo.Dog" />
  <bean id="people" class="com.beizi.pojo.People">
    <property name="name" value="121" />
    <!--<property id="cat" ref="Cat" />-->
    <!--<property id="dog" ref="Dog" />-->
  </bean>
</beans>
@Autowired
private Dog dog;

使用注解开发

  • <context:annotation-config /> 注解支持
  • <context:component-scan base-package="com.beizi" />扫描包

装配bean

  • @Component
    • 组件,放在类上,说明这个类被Spring管理了,就是bean
    • 衍生注解
      1. dao(@Repository)
      2. service(@Service)
      3. controller(@Controller)
      • 这四个注解的功能一致,都是代表将某个类注册到Spring中,装配Bean
  • @Value 注入属性
<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd">
    <context:annotation-config />
    <!--指定要扫描的包,这个包下的注解都会生效-->
    <context:component-scan base-package="com.beizi" />
</beans>
  • @Scope("prototype"),作用域

使用java的方式配置Spring

@Configuration // 代表这是一个配置类,等价于beans.xml
@ComponentScan("com.kuang.pojo") // 代表扫描包
public class AppConfig {

  // 注册一个bean,相当于bean标签
  // 方法名就相当于bean标签的id属性
  // 返回值就相当于bean标签中的class属性,一个pojo对象
  @Bean
  public user getUser() {
    return new User();
  }
}

// 使用new AnnotationConfigApplicationContext(AppConfig.class)获取context

AOP

代理模式

  • Spring AOP的底层!
  • 分类
    • 静态代理
    • 动态代理
静态代理
  1. 角色分析
  • 抽象角色:一般会使用接口或者抽象类来解决
  • 代理角色:代理真实角色,做一些附属操作
  • 真实角色:被代理的角色
  • 客户:访问代理对象的人
  1. 好处
  • 真实觉得的操作更加纯粹
  • 实现了业务分工
  • 公共业务发生扩展的时候,方便集中管理
  1. 缺点
  • 一个真实角色就会产生一个代理角色,代码量可能会翻倍
动态代理
  1. 角色分析,与静态代理角色一样
  2. 动态代理的代理类是动态生成的,不是我们直接写好的
  3. 动态代理分为:基于接口的动态代理、基于类的动态代理
  • 基于接口 -- JDK 动态代理
  • 基于类 -- cglib
  • java字节码实现 -- JAVAssist
  1. 了解两个类:Proxy,InvocationHandler
  2. 步骤
public class PIC implements InvocationHandler {
  // 被代理的接口
  private Object target;

  public void setTarget(Object target) {
    this.target = target;
  }

  // 生成代理类
  public Object getProxy() {
    return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
  }

  // 处理代理类实例,并返回结果
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    return method.invoke(target, args);
  }
}
  1. 好处
  • 一个动态代理类可以代理多个类

什么是AOP

  • 面向切面编程
  1. 实现官方接口
<!--需要引入aop的xmlns-->
<aop:config>
  <!--切入点-->
  <aop:pointcut id="pointcut" expression="execution(* com.beizi.service.UserServiceImpl.*(..))" />
  <!--执行的配置-->
  <aop:advisor advice-ref="log" pointcut-ref="pointcut" />
</aop:config>
  1. 自定义类
<bean id="diy" class="com.beizi.diy.DiyPoint" />
<aop:config>
  <aop:aspect ref="diy">
    <!--切入点-->
    <aop:pointcut id="point" expression="execution(* com.beizi.service.UserServiceImpl.*(..))" />
    <!--通知-->
    <aop:before method="before" pointcut-ref="point" />
    <aop:after method="after" pointcut-ref="point" />
  </aop:aspect>
</aop:config>

Spring Boot

  • 一个快速开发的脚手架
  • 基于Spring Boot可以快速开发单个微服务
  • 约定大于配置

原理初探

Spring Boot所有自动配置都是在启动的时候扫描并加载,spring.factories所有的自动配置类都在这里,但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后就配置成功!

Run

  • 不仅仅是执行了main方法,也是开启了一个服务
@SpringBootApplication
public class SpringbootDemo{
  public static void main(String[] args) {
    // 该方法返回一个ConfigurableApplicationContext对象
    // 参数一:应用入口的类。参数类:命令行参数
    SpringApplication.run(SpringbootDemo.calss,args);
  }
}

@ConfigurationProperties

  • 作用:
  1. 将配置文件中配置的每个属性的值映射到这个组件中
  2. 告诉Spring Boot讲本类中所有属性和配置文件中相关的配置进行绑定
  3. 参数prefix="person":将配置文件中的person下面的所有属性一一对应

自动装配原理

  1. SpringBoot启动会加载大量的自动配置类
  2. 我们看我们需要的功能有没有在Spring Boot默认写好的自动配置类当中
  3. 我们再看这个自动配置类中到底装配了哪些组件
  4. 给容器自动配置类添加组件的时候,会从properties类中获取某些属性,我们只需要在配置文件中指定这些属性的值即可
  • xxxAutoConfiguration:自动配置类,给容器添加组件
  • xxxProperties:封装配置文件中相关属性
posted @ 2023-04-18 21:03  北子_bro  阅读(9)  评论(0)    收藏  举报