概述、体系结构

Spring IoC容器

Inverse Of Controller即为控制反转,简称IOC IOC反转了依赖关系的满足方式,由之前的自己创建依赖关系,变为由工厂推送

IOC有两个不同的类型BeanFactory容器和ApplicationContext容器

ApplicationContext包含BeanFactory,该容器添加了更多企业特定的功能 例如从一个属性文件中解析文本信息的能力,发布应用程序事件给感兴趣的事件监听器的能力 通常不建议使用BeanFactory。BeanFactory 仍然可以用于轻量级的应用程序,如移动设备或基于 applet 的应用程序,其中它的数据量和速度是显著。

BeanFactory容器

  1. // hello.java
  2. public class hello {
  3. private String message;
  4. public void setMessage(String message){
  5. this.message = message;
  6. }
  7. public void getMessage(){
  8. System.out.println("Your Message : " + message);
  9. }
  10. }
  11. // main.java
  12. public class main {
  13. public static void main(String[] args) {
  14. XmlBeanFactory factory = new XmlBeanFactory
  15. (new ClassPathResource("Beans.xml"));
  16. HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");
  17. obj.getMessage();
  18. }
  19. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6. <bean id="hello" class="com.tutorialspoint.hello">
  7. <property name="message" value="Hello World!"/>
  8. </bean>
  9. </beans>

ApplicationContext容器

  1. // hello.java
  2. public class hello {
  3. private String message;
  4. public void setMessage(String message){
  5. this.message = message;
  6. }
  7. public void getMessage(){
  8. System.out.println("Your Message : " + message);
  9. }
  10. }
  11. // main.java
  12. public class main {
  13. public static void main(String[] args) {
  14. ApplicationContext context = new FileSystemXmlApplicationContext
  15. ("C:/Users/ZARA/workspace/HelloSpring/src/Beans.xml");
  16. HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
  17. obj.getMessage();
  18. }
  19. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6. <bean id="hello" class="com.tutorialspoint.hello">
  7. <property name="message" value="Hello World!"/>
  8. </bean>
  9. </beans>

Bean的对象

bean对象是由Spring IoC容器管理的,bean定义包含成为配置元数据

  • bean生命周期
  1. bean的定义
  2. bean的初始化init-method="initMethod"
  3. bean的使用
  4. bean的销毁destroy-method="destroyMethod"
  • bean后置配置器生命周期
    • 使用接口BeanPostProcessor
  1. bean的定义
  2. 后置配置器初始化前调用postProcessBeforeInitialization
  3. bean的初始化init-method="initMethod"
  4. 后置配置器初始化后调用postProcessAfterInitialization
  5. bean的使用
  6. bean的销毁destroy-method="destroyMethod"

    Spring 依赖注入

    通过依赖注入的方式管理bean之间的依赖关系 依赖注入就是将互相有关联性的java类通过依赖注入的方式,让它们粘合起来 保持独立的同时,又能相互关联 例如:Controller->Service->Dao

  1. <bean id="userController" class="com.atguigu.Controller">
  2. <constructor-arg ref="userService"/>
  3. </bean>
  4. <bean id="userService" class="com.atguigu.Service">
  5. <constructor-arg ref="userDao"/>
  6. </bean>
  7. <bean id="userDao" class="com.atguigu.Dao">
  8. <property name="name" value="张三"/>
  9. </bean>

Spring Beans 自动装配

Spring 基于注解的配置

  1. // 注解方式IOC
  2. @Compoonent
  3. 用在三层结构之外的其它要进行IOC的类上
  4. @Controller
  5. 用在表现层要进行IOC的类上
  6. @Service
  7. 用在业务层要进行IOC的类上
  8. @Repository
  9. 用在持久层要进行IOC的类上
  10. @Required
  11. 注入Bean类型的对象(IOC 容器中的对象)
  12. 它默认是按照类型进行自动装配,要求IOC容器中只有一个要注入的类型的对象
  13. // 注解方式DI
  14. @Value
  15. 注入简单类型的数据值
  16. @PropertySource
  17. 引入外部的properties文件
  18. // 自动装配
  19. @Autowired
  20. byType 查找Bean
  21. 如果能找到唯一的Bean,则将其注入进来
  22. 如果找不到Bean, 则报错
  23. 如果找到了多个该类型的Bean,那么就会byName 查找Bean
  24. byName 查找Bean
  25. 如果没有结合Qualifier注解指定Beanid/name: 根据属性名匹配Beanid/name
  26. 如果能匹配到唯一Bean则注入,匹配不到则报错
  27. 如果集合Qualifier注解一起使用: 则直接byName 查找Bean,
  28. 根据Qualifier注解中配置的name/id查找Bean
  29. @Resource
  30. 如果同时配置了nametype属性: 就根据nametype属性查找唯一的Bean
  31. 能找到就注入,不能找到就报错
  32. 如果只配置了name属性: 就根据name属性查找为一的Bean,能找到就注入,不能找到就报错
  33. 如果只配置了type属性: 就根据type属性查找唯一的Bean,能找到就注入,不能找到就报错,
  34. 如果能找到多个则byName查找Bean(属性名与Beanid匹配)
  35. 如果既没有配置type属性,又没有配置name属性:
  36. byName: 根据属性名对应Beanid查找唯一的Bean,能找到则注入,不能找到则会byType查找
  37. byType: 根据类型查找唯一的Bean
  38. @Qualifier
  39. @PostConstruct
  40. @PreDestroy
  41. // 面向切面的编程(AOP)框架
  42. @Pointcut
  43. 声明切入点,其他类可以引用这个切入点,易于维护
  44. @Aspect
  45. 前置通知
  46. @AfterReturning
  47. 返回通知
  48. @AfterThrowing
  49. 异常通知
  50. @After
  51. 后置通知
  52. @Around
  53. 环绕通知
  54. @Before

四种包扫描方法

  1. 1. 1. 基本扫描
  2. <context:component-scan base-package="com.atguigu"></context:component-scan>
  3. 2. 扫描具体规则
  4. <context:component-scan base-package="com.atguigu" resource-pattern="*Impl.class">
  5. </context:component-scan>
  6. 3. 排除某个注解
  7. <context:component-scan base-package="com.atguigu">
  8. <context:exclude-filter type="annotation"
  9. expression="org.springframework.stereotype.Controller"/>
  10. </context:component-scan>
  11. 4. 针对性扫描,扫描指定包以及后代包下的IOC注解
  12. <context:component-scan base-package="com.atguigu" use-default-filters="false">
  13. <context:include-filter type="annotation"
  14. expression="org.springframework.stereotype.Controller"/>
  15. </context:component-scan>

Spring 框架的AOP

Spring JDBC框架

Spring 事务管理

Spring Web MVC框架

image.png