黑马SSM框架学习—spring_day01

文章目录


前言

        该系列是对SSM框架教程的学习笔记,涉及到了Spring,SpringMVC,Maven,SpringBoot,MyBatisPlus。内容根据官方给出的代码资源进行整理,资源已给出供参考。


一、IoC入门

<!--1.导入spring的坐标spring-context,对应版本是5.2.10.RELEASE-->
     <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
<!--2.配置bean-->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<!--3.获取IoC容器-->
    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
<!--4.获取bean(根据bean配置id获取)-->
    BookService bookService = (BookService) ctx.getBean("bookService");
    bookService.save();
<!--5.删除业务层中使用new的方式创建的dao对象-->
    private BookDao bookDao;
<!--6.提供对应的set方法-->
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
<!--7.配置server与dao的关系-->
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
    </bean>
    <!--property标签表示配置当前bean的属性
        name属性表示配置哪一个具体的属性
        ref属性表示参照哪一个bean-->

二、bean

1.bean配置

(1)bean基础配置

<bean id="bookService" name="service service4 bookEbi" class="com.itheima.service.impl.BookServiceImpl"/> 

(2)bean别名配置

        定义bean的别名可定义多个,使用逗号, 分号; 空格  分割

 <bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" />

(3)bean作用范围配置

<!--scope:为bean设置作用范围,可选值为单例singloton,非单例prototype-->
<bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype"/>

2.bean实例化

(1)构造函数 

  • bean本质上就是对象,创建bean使用构造方法完成

(2)静态工厂

public class OrderDaoFactory {
    public static OrderDao getOrderDao(){
        System.out.println("factory setup....");
        return new OrderDaoImpl();
    }
}
  •  配置
<bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>

(3)实例工厂

  • 实例工厂
public class UserDaoFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}
  •  配置
<bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/>

<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>

(4)FactoryBean [实用]

  •   FactoryBean
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    //代替原始实例工厂中创建对象的方法
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    public Class<?> getObjectType() {
        return UserDao.class;
    }

    /* public boolean isSingleton(){
        return true;
    }*/
    //此方法使其创建单例对象

}
  •  配置
<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>

3.bean的生命周期 

  •  初始化容器
    • 创建对象(内存分配)
    • 执行构造方法
    • 执行属性注入(set)
    • 执行bean初始化方法
  •  使用bean—执行业务操作
  •  关闭/销毁容器

(1)bean生命周期控制

        1)提供生命周期控制方法
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
    //表示bean初始化对应的操作
    public void init(){
        System.out.println("init...");
    }
    //表示bean销毁前对应的操作
    public void destory(){
        System.out.println("destory...");
    }
}
  • 配置生命周期的方法 
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
        2)实现InitializingBean, DisposableBean接口
public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
    private BookDao bookDao;

    public void setBookDao(BookDao bookDao) {
        System.out.println("set .....");
        this.bookDao = bookDao;
    }

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }

    public void destroy() throws Exception {
        System.out.println("service destroy");
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("service init");
    }
}

(2)bean销毁时机

  • 容器关闭前触发bean的销毁
  • 关闭容器方式
    • 手工关闭       
    • 注册关闭钩子,在Java虚拟机退出前先关闭容器再退出虚拟机
      ctx.registerShutdownHook();

三、DI (依赖注入)

1.依赖注入方式

1. 向一个类中传递数据有两种方式:普通方法(set)和构造方法

2. 依赖注入需要描述在容器中建立bean与bean之间的依赖关系,也涉及bean与数字或字符串,所以就有两种类型:引用类型和简单类型

3. 因此,依赖注入方式分为以下几种:

  • setter注入
    • 简单类型
    • 引用类型
  • 构造器注入
    • 简单类型
    • 引用类型

(1)setter注入 

         1)简单类型

        · 在bean中定义引用类型属性并提供可访问的set方法

public class BookDaoImpl implements BookDao {

    private int connectionNum;
    //setter注入需要提供要注入对象的set方法
    public void setConnectionNum(int connectionNum) {
        this.connectionNum = connectionNum;
    }
}

         · 配置中使用property标签value属性注入简单类型数据 

 <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <!--property标签:设置注入属性-->
        <!--name属性:设置注入的属性名,实际是set方法对应的名称-->
        <!--value属性:设置注入简单类型数据值-->
        <property name="connectionNum" value="100"/>
    </bean>
        2)引用类型

         · 在bean中定义引用类型属性并提供可访问的set方法

public class BookServiceImpl implements BookService{
    private BookDao bookDao;
    
    //setter注入需要提供要注入对象的set方法
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

         ·  配置中使用property标签ref属性注入引用类型对象

<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <!--property标签:设置注入属性-->
        <!--name属性:设置注入的属性名,实际是set方法对应的名称-->
        <!--ref属性:设置注入引用类型bean的id或name-->
        <property name="bookDao" ref="bookDao"/>
    </bean>

(2)构造器注入

        1)简单类型

         · 在bean中定义简单类型属性并提供可访问的构造方法

public class BookDaoImpl implements BookDao {
    private String databaseName;
    private int connectionNum;

    public BookDaoImpl(String databaseName, int connectionNum) {
        this.databaseName = databaseName;
        this.connectionNum = connectionNum;
    }

    public void save() {
        System.out.println("book dao save ..."+databaseName+","+connectionNum);
    }
}

        · 配置中使用constructor-arg标签ref属性注入简单类型对象

<!--标准书写-->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        //根据构造方法参数名称注入
        <constructor-arg name="connectionNum" value="10"/>
        <constructor-arg name="databaseName" value="mysql"/>
    </bean>

         · 配置中使用constructor-arg标签type属性设置按形参类型注入

 <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        //根据构造方法参数类型注入
        <constructor-arg type="int" value="10"/>
        <constructor-arg type="java.lang.String" value="mysql"/>
    </bean>

         · 配置中使用constructor-arg标签index属性设置按形参类型注入

<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <!--根据构造方法参数位置注入-->
        <constructor-arg index="0" value="mysql"/>
        <constructor-arg index="1" value="100"/>
    </bean>
        2)引用类型

         · 在bean中定义引用类型属性并提供可访问的构造方法

public class BookServiceImpl implements BookService{
    private BookDao bookDao;
    private UserDao userDao;

    public BookServiceImpl(BookDao bookDao, UserDao userDao) {
        this.bookDao = bookDao;
        this.userDao = userDao;
    }

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
        userDao.save();
    }
}

        · 配置中使用constructor-arg标签ref属性注入引用类型对象

<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
    <constructor-arg name="userDao" ref="userDao"/>
    <constructor-arg name="bookDao" ref="bookDao"/>
  </bean>

2.依赖自动装配 

        · 配置中使用bean标签autowire属性设置自动装配的类型

<bean class="com.itheima.dao.impl.BookDaoImpl"/>
    <!--autowire属性:开启自动装配,通常使用按类型装配-->
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>

 注意点:

1.自动装配用于引用类型依赖注入,不能对简单类型进行操作;

2.使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用;

3.使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用;

4.自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效。

3.集合注入

<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <!--数组注入-->
        <property name="array">
            <array>
                <value>100</value>
                <value>200</value>
                <value>300</value>
            </array>
        </property>
        <!--list集合注入-->
        <property name="list">
            <list>
                <value>itcast</value>
                <value>itheima</value>
                <value>boxuegu</value>
                <value>chuanzhihui</value>
            </list>
        </property>
        <!--set集合注入-->
        <property name="set">
            <set>
                <value>itcast</value>
                <value>itheima</value>
                <value>boxuegu</value>
                <value>boxuegu</value>
            </set>
        </property>
        <!--map集合注入-->
        <property name="map">
            <map>
                <entry key="country" value="china"/>
                <entry key="province" value="henan"/>
                <entry key="city" value="kaifeng"/>
            </map>
        </property>
        <!--Properties注入-->
        <property name="properties">
            <props>
                <prop key="country">china</prop>
                <prop key="province">henan</prop>
                <prop key="city">kaifeng</prop>
            </props>
        </property>
    </bean>

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值