SpringDay01-入门基础知识、Bean的配置(一)

Spring(黑马)

一、基础知识

1.1 传统JavaWeb的缺点

  • 传统的JavaWeb在实现某个主要的业务逻辑时需要做的事情:
    • new一个实现类对象,然后通过对象调用某个主要的方法;
    • 开启事务、提交事务、回滚事务;在日志中记录修改数据;
    • 在日志中记录异常数据等。
  • 以上传统方法带来的问题:
    • 实现类与接口过于耦合--通过工厂模式,以第三方的方式解决耦合问题
    • service层事务功能、日志功能都与业务代码过于耦合

1.2 IOC、DI、AOP思想

  • IOC:控制反转 即业务层需要用到Bean对象时不再使用new的方式,而是通过第三方(动态代理)来拿到Bean对象,将创建Bean的权力控制反转给第三方。
  • DI:依赖注入 即Bean对象需要用到另一个Bean对象时也同样不再使用new的关系,可以直接交给第三方,不需要开发人员在业务层程序代码中进行设置。
  • AOP:面向切面编程 即对某一个Bean进行增强,主要是通过代理Proxy。

1.3 框架的概念

  • 从众多业务中抽取出来的通用的解决方案。
  • 使用了大量的设计模式,如反射、xml解析、注解解析
  • 使用简单的代码实现复杂的功能
  • 有了框架可以将精力集中于业务开发

1.4 Spring框架

  • 官方网站:spring.io 在首页栏的project查看各种框架的学习文档
  • Spring Freamwork:(学习主体)
    • Core Container:开发时会引入4个jar包(Maven开发时会引入4个坐标)
      • Beans
      • Core
      • Context
      • SpEL(表达式)
    • AOP(主要学习AOP技术)
    • Aspects(切面)
    • Data Access/Integration(数据访问层)
      • JDBC
      • ORM(JDBC框架)
      • Transaction(事务)
    • Web

二、快速入门

2.1 BeanFactory快速入门

  • BeanFactory工厂模式 即第三方,需要一个配置文件,对Bean进行一些说明

  • BeanFactory工厂模式的开发步骤(IOC+DI):

    【程序代码------>第三方------>配置文件------>Bean类】

    • 1、导入第三方 即Spring的jar包或者Maven坐标

    • 2、Bean类 即编写UserService接口以及UserServiceImpl实现类

    • 3、创建beans.xml配置文件,将UserServiceImpl的信息配置到该xml中

      <bean id="userService" class="impl的全类名"> <property name="impl中的方法名去掉test后首字母小写" ref="UserDao的id"></property></bean>
      
    • 4、编写测试用例,创建BeanFactory,加载配置文件,获取UserService实例对象

  • Spring核心依赖:

    • 1)spring核心依赖
      spring-core、spring-beans、spring-context
    • 2)spring dao依赖(提供JDBCTemplate)
      spring-jdbc、spring-tx
    • 3)spring web依赖
      spring-web、spring-webmvc
    • 4)spring test依赖
      spring-test
  • BeanFactory主要的实现类

    • DefaultListableBeanFactory

2.2 ApplicationContext快速入门

  • ApplicationContext称为Spring容器,内部封装了BeanFactory,后续开发常用。xml文件名称习惯写成applicationContext.xml。
  • ApplicationContext开发步骤:
    • 1、创建ApplicationContext接口变量指向子类对象--ClassPathXmlApplicationContext
    • 2、调用getBean()方法获取userService对象,同时执行了setUserDao()方法
  • ApplicationContext主要的实现类
    • ClassPathXmlApplicationContext--加载类路径下的ApplicationContext(Spring容器)
    • FileSystemXmlApplicationContext--加载磁盘路径下的ApplicationContext
    • AnnotationConfigApplicationContext--加载注解配置类的ApplicationContext

2.3 BeanFactory和ApplicationContext的关系

  • BeanFactory是Spring的早期接口,称为Spring的Bean工厂,ApplicationContext是后期更高级的接口,称之为Spring容器

  • BeanFactory的API更偏向底层,ApplicationContext的API大多数是对这些底层API的封装

  • ApplicationContext不仅继承BeanFactory,内部还维护着BeanFactory的引用,所以二者既有继承关系,又有融合关系

  • 二者Bean的初始化时机不同,BeanFactory是在首次调用getBean时才进行Bean的创建,而ApplicationContext则是创建容器 配置文件加载的时候将Bean都实例化并且都创建好。

三、基于Xml的Spring应用

3.1 Bean标签的基础配置

  • id必须唯一,bean对象有一个默认的name,是class的值;如果配置了id,那么name就是id的值;如果没有配置id,配置了name,那么name就是name的值;如果id和name都没有配置,那么name的值就是默认的class的值。
<bean id=" " name=" " class=""></bean>
  • 范围scope(很少配置这个)

    • singleton--单例(默认),只创建并且实例化一次对象,每次调用getBean()时使用的都是同一个对象,实例化的对象会存储在Spring容器的单例池中。单例池:singletonObjects.
    • prototype--原型,每一次调用getBean()时都会创建并实例化一次对象,因此每个对象都不一样,用完后就销毁,不会存储在容器中。
    <bean scope="sington"></bean>
    
  • 延迟加载lazy-init

    • 当使用ApplicationContext时,创建容器的时候就会立马实例化并且创建bean对象,如果将lazy-init设置为true时则不会立即创建,而是在使用时创建并且存储到单例池中,本质上仍然是单例的。

      <bean lazy-init="true"></bean>
      
  • 自定义初始化和销毁方法

    • 初始化--在UserServiceImpl中定义init()方法,后在bean标签中配置init-method=init()。init()方法在创建对象后 构造方法执行完后会被调用

    • 销毁--在UserServiceImpl中定义destroy()方法,后在bean标签中配置destroy-method=destroy()。destroy()方法会在关闭容器时调用,一般不怎么用。

      <bean init-method=init() destroy-method=destroy()></bean>
      
  • Bean传递有参构造参数

    <bean><constructor-arg name="age" value="18"></constructor-arg></bean>
    
  • Bean的实例化方式

    • 自定义静态工厂方法实例化Bean

      • 1、创建工厂类,自定义静态方法
      public class MyFactory {
          //自定义工厂 实例化Bean
          public static UserDao factory(){
              //Bean创建之前可以进行一些其他的业务逻辑操作
              return new UserDaoImpl();
          }
      }
      
      • 2、配置beans.xml文档
      <bean id="userDao1" class="com.fresh_yuan.factory.MyFactory" factory-method="factory"></bean>
      
      • 3、测试
      public class ApplicationContextTest {
          public static void main(String[] args) {
              ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
              Object userDao1 = applicationContext.getBean("userDao1");
              System.out.println(userDao1);
          }
      }
      
      输出结果:
      com.fresh_yuan.dao.impl.UserDaoImpl@5dd6264
      
    • 自定义实例工厂方法实例化Bean

      • 1、创建工厂,方法不使用static修饰

        public class MyFactory2 {
            //自定义实例工厂实例化Bean
            public UserDao factory2(){//注意方法没有static关键字修饰
                System.out.println("实例工厂调用了");
                return new UserDaoImpl();
            }
        }
        
      • 2、配置beans.xml(这是重点)

      <!--   首先创建工厂的实例化对象,通过工厂的实例化对象调用非静态方法,从而实例化Bean    -->
      <bean id="myFactory" class="com.fresh_yuan.factory.MyFactory2"></bean>
      <bean id="userDao2" factory-bean="myFactory" factory-method="factory2"></bean>
      
      • 3、测试

        public class ApplicationContextTest {
            public static void main(String[] args) {
                ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
                //UserService userService = (UserService) applicationContext.getBean("userService");
                Object userDao2 = applicationContext.getBean("userDao2");
                System.out.println(userDao2);
            }
        }
        
posted @ 2023-04-22 23:00  小园初来乍到  阅读(40)  评论(0)    收藏  举报