Spring5学习——打卡第一天

今日学习内容——Spring5的核心IOC

IOC容器:

(1)Inversion of control 控制反转,把对象的创建和对象的调用交给Spring进行管理。

(2)使用IOC的目的:耦合度降低。

(3)入门案例就是IOC的实现

2 、IOC底层原理

(1)      xml解析、工厂模式、反射。

3 IOC(接口)

(1)      IOC思想是基于IOC容器实现两种方式:(两个接口)

BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供给开发人员进行使用,加载配置文件时候不会创建对象,再获取对象(使用)才去创建。

    ApplicationContext: BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员使用。加载配置文件在配置文件对象进行创建。

ApplicationContext接口有两个实现类:FileSystemXmlApplicationContex参数是对象类的绝对路径。ClassPathXmlApplicationContext参数是根目录的相对路径。

4 IOC的bean管理(创建对象和属性注入)。

(1)      基于xml配置文件方式来实现

创建对象:<bean id=”” class=”” name=””>,创建对象执行无参构造创建对象。

(2)      基于注解方式实现。(完全注解开发springboot2)

DI:依赖注入,注入属性。在创建对象的基础上。

set注入

有参构造注入

                 P空间注入(set注入,了解)

          Xml注入其他属性

1、 字面量

Null值和特殊符号

<property name="address">
    <null></null>
</property>

 

特殊符号&lt;&gt;转义或者CDATA

<property name="address">
    <value><![CDATA[<<软件工程>>]]></value>
</property>
<property name="address" value="&lt;&lt;软件工程1&gt;&gt;"></property>

注入外部bean、内部bean、级联bean。

public class UserService {
    //创建UserDao属性,生成set方法
    private UserDao userDao;

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void serviceAdd(){
        System.out.println("service add................");
        userDao.update();
    }
}

 

<bean id="userService" class="com.rsh.spring5.service.UserService">
    <property name="userDao" ref="userDao">
    </property>
</bean>
<bean id="userDao" class="com.rsh.spring5.dao.UserDaoImpl"></bean>

 

@Test
public void testUserService(){
    //加载spring配置文件
    ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
    //获取配置创建对象
    UserService userService = context.getBean("userService", UserService.class);
    System.out.println(userService);
    userService.serviceAdd();
}

内部·bean

<bean id="emp" class="com.rsh.spring5.bean.Emp">
    <property name="EName" value="王思聪"></property>
    <property name="EGender" value="男"></property>
    <property name="dept">
       <bean id="dept" class="com.rsh.spring5.bean.Dept">
           <property name="dName" value="保安部"></property>
       </bean>
    </property>
</bean>

级联赋值

<bean id="emp" class="com.rsh.spring5.bean.Emp">
    <property name="EName" value="张三"></property>
    <property name="EGender" value="男"></property>
    <property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="com.rsh.spring5.bean.Dept">
    <property name="dName" value="财务部"></property>
</bean>

级联赋值写法二

<bean id="emp" class="com.rsh.spring5.bean.Emp">
    <property name="EName" value="王梅"></property>
    <property name="EGender" value="男"></property>
    <property name="dept" ref="dept"></property>
    <property name="dept.dName" value="技术部"></property>
</bean>
<bean id="dept" class="com.rsh.spring5.bean.Dept">
    <property name="dName" value="财务部"></property>
</bean>
public Dept getDept() {
    return dept;
}

public void setDept(Dept dept) {
    this.dept = dept;
}

基于xml注入数组、集合、map、set属性。

<bean id="stu" class="com.rsh.spring5.collectionType.Stu">
    <property name="courses">
        <array>
            <value>软件工程</value>
            <value>数据库程序设计</value>
            <value>php程序设计</value>
            <value>web应用开发</value>
        </array>
    </property>
    <property name="list">
        <list>
            <value>软件工程</value>
            <value>数据库程序设计</value>
            <value>php程序设计</value>
            <value>web应用开发</value>
        </list>
    </property>
    <property name="map">
        <map>
            <entry key="software" value="软件工程"></entry>
            <entry key="sqlserver" value="数据库程序设计"></entry>
            <entry key="php" value="php程序设计"></entry>
            <entry key="web" value="web应用开发"></entry>
        </map>
    </property>
    <property name="set">
        <set>
            <value>软件工程</value>
            <value>数据库程序设计</value>
            <value>php程序设计</value>
            <value>web应用开发</value>
        </set>
    </property>
</bean>

集合中的元素是对象

 

<property name="courseList">
    <list>
        <ref bean="course1"></ref>
        <ref bean="course2"></ref>
        <ref bean="course3"></ref>
        <ref bean="course4"></ref>
    </list>
</property>
<bean id="course1" class="com.rsh.spring5.collectionType.Course">
    <property name="cName" value="软件工程"></property>
    <property name="tName" value="王建民"></property>
</bean>
<bean id="course2" class="com.rsh.spring5.collectionType.Course">
    <property name="cName" value="数据库程序设计"></property>
    <property name="tName" value="杨子光"></property>
</bean>
<bean id="course3" class="com.rsh.spring5.collectionType.Course">
    <property name="cName" value="php程序设计"></property>
    <property name="tName" value="刘丹"></property>
</bean>
<bean id="course4" class="com.rsh.spring5.collectionType.Course">
    <property name="cName" value="web应用设计"></property>
    <property name="tName" value="雷宇"></property>
</bean>

提取集合注入部分

(1)      引入命名空间

xmlns:util="http://www.springframework.org/schema/util"
http://www.springframework.org/schema/util  http://www.springframework.org/schema/util/spring-util.xsd
<util:list id="bookList">
    <value>软件工程</value>
    <value>数据库程序设计</value>
    <value>php程序设计</value>
    <value>web应用开发</value>
</util:list>
<bean id="course1" class="com.rsh.spring5.collectionType.Course1">
    <property name="list" ref="bookList"></property>
</bean>

IOC bean管理有两种bean

一种普通·bean另一种就是工厂bean(FactoryBean)

普通bean:在配置文件定义bean类型返回该类型。

工厂bean:在配置文件定义的bean类型可以跟返回类型不一样。

第一部创建类,这个类作为工厂bean,实现接口FactoryBean

第二步实现接口里面的方法,在实现的方法中返回定义bean类型。

<bean id="myBean" class="com.rsh.spring5.factoryBean.MyBean"></bean>
public class MyBean implements FactoryBean<Course> {
    @Override
    public Course getObject() throws Exception {
        Course course = new Course();
        course.setcName("数学");
        course.settName("梨花");
        return course;
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    public boolean isSingleton() {
        return FactoryBean.super.isSingleton();
    }

bean的作用域,bean是否是单实例。

Spring默认是单实例scope属性,第一个值 ,singleyon,单实例对象。

Prototype表示多实例对象。

<bean id="book" class="com.rsh.spring5.Book" scope="prototype">

单实例对象在加载配置文件时创建对象。

 

Bean的生命周期

第一步,构造方法被执行
第二步,set方法被执行
第三步,初始化方法被执行
第四步,获取对象方法被执行
第五步,销毁方法被执行
 

 

Bean的后置处理器

在初始化之前执行的方法

在初始化之后执行的方法

第一步,构造方法被执行

第二步,set方法被执行

在初始化之前执行的方法

第三步,初始化方法被执行

在初始化之后执行的方法

第四步,获取对象方法被执行

第五步,销毁方法被执行

 

Bean自动装配

(1)      根据指定装配规则(属性名称或者属性类型),spring自动将匹配的属性值进行注入。

Autowrite属性两个值

ByName根据属性名注入,注入值bean的id值和类属性名相同。

ByType根据属性类型自动注入。

<bean id="emp" class="com.rsh.spring5.autowrite.Emp" autowire="byName">
<!--        <property name="dept" ref="dept"></property>-->
    </bean>
    <bean id="dept" class="com.rsh.spring5.autowrite.Dept"></bean>

Bean引入外部属性文件

配置数据库信息

(1)      配置德鲁伊数据库连接池

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql://localhost:3306/stu"></property>
    <property name="username" value="root"></property>
    <property name="password" value="041765rsh"></property>
</bean>

(2)      把外部的properties文件引入spring配置文件

引入context命名空间,xmlns:context="http://www.springframework.org/schema/context"

 

http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context.xsd

 

<context:property-placeholder location="jdbc.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${prop.driverClass}"></property>
    <property name="url" value="${prop.url}"></property>
    <property name="username" value="${prop.userName}"></property>
    <property name="password" value="${prop.password}"></property>
</bean>

IOC操作的注解方式

  1. 什么是注解

(1)      注解是代码的特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值)(2)使用注解,注解作用在类、方法、属性上。(3)使用注解目的,简化xml配置

2 spring针对Bean管理创建对象提供注解

(1)@Component普通注解方式

(2)@Service 用于service层

(3)@Controller用于外部层

(4)@Reposity 用于dao层

*上面四个注解功能是一样的,都可以用来创建bean实例。

基于注解方式的对象创建

引入依赖,开启组件扫描,

当@Compent的“(value = “”)“省略的话,默认是首字母小写的类名。

@Component
public class UserService {
    public void add(){
        System.out.println("userService add .............");
    }
}

我这里报错了,因为我的运行环境时JDK17,只有spring-framework 5.3以上版本才可以使用。所以我换了导入的依赖,问题就解决了。

 

基于注解方式的属性注入

注解:@AutoWrited根据属性类型@Qualifier属性名称 @Resource两者都可以(三个都是对象类型的)

完全注解开发

将xml类替换成配置类

@Configuration
@ComponentScan(basePackages = {"com.rsh"})
public class SpringConfig {
}
posted @ 2022-06-26 22:09  几人著眼到青衫  阅读(36)  评论(0)    收藏  举报