Spring入门

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring入门相关的知识,希望对你有一定的参考价值。

Spring相关知识点整理

Spring体系结构

在这里插入图片描述

Spring程序开发步骤

在这里插入图片描述
1.创建一个maven项目,在pom.xml中导入spring的坐标

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>SpringDemo2</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.15.RELEASE</version>
        </dependency>
    </dependencies>

</project>

2.创建UserDao接口和UserDao接口的实现类UserDaoImpl
3.创建spring的xml配置文件,然后在其中给实现类标注id
在这里插入图片描述

   <bean id="userDao" class="com.impl.UserDaoImpl"></bean>
  1. 创建一个测试Demo,查看是否能够获取指定实现类对象,并调用其方法
public class testDemo {
    public static void main(String[] args) {
        ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) app.getBean("userDao");
        userDao.say();
    }
}

在这里插入图片描述


Spring配置文件


Bean标签的基本配置

在这里插入图片描述


Bean标签的范围配置

默认是singleton
在这里插入图片描述

默认情况下演示:

    <bean id="userDao" class="com.impl.UserDaoImpl"></bean>
        ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) app.getBean("userDao");
        UserDao userDao1=(UserDao)app.getBean("userDao");
        System.out.println(userDao);
        System.out.println(userDao1);

在这里插入图片描述

默认单例模式

ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");

意思是加载配置文件,创建Spring容器


内部Bean----匿名,外部无法访问,无别名

1.在或内部通过定义的,

2.该bean不管是否指定id或者name,该bean都有一个唯一的匿名标识符,且不能被指定别名

3.该bean队其他外部的bean不可见。

在这里插入图片描述


util名称空间—创建集合的id,方便引用

Util名称空间创建的集合有id,可以给其他bean引用,在使用前需要引入名称空间:

xmlns:util=“http://www.springframework.org/schema/util”

<?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:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
		
	<!-- 相当于new LinkedHashMap() -->
	<util:map id="myMap">
		<entry key="key01" value="value01"></entry>
	</util:map>
	
	<bean id="person" class="com.atguigu.bean.Person">
		<!-- 引用myMap -->
		<property name="map" ref="myMap"></property>
	</bean>
</beans>

级联属性----选择属性的属性

通过属性(a)选择属性(a)的属性(b)

	<bean id="car01" class="com.atguigu.bean.Car">
		<property name="carName" value="宝马"></property>
	</bean>

	<!-- 级联属性:属性的属性 -->
	<bean id="person01" class="com.atguigu.bean.Person">
		<!-- 为car赋值的时候改变car的属性 -->
		<property name="car" ref="car01"></property>
		<!-- 给car属性的carName属性赋值 -->
		<property name="car.carName" value="奔驰"></property>
	</bean>

ref引用是地址引用,可以理解为c++里面的地址传递


继承配置信息

在bean定义中包含了大量的配置信息,其中包括容器相关的信息(比如初始化方法、静态工厂方法名等等)以及构造器参数和属性值。子bean定义就是从父bean定义继承配置数据的bean定义。它可以覆盖父bean的一些值,或者添加一些它需要的值。使用父/子bean定义的形式可以节省很多的输入工作。实际上,这就是一种模板形式。

class全类名也会继承,但是只是继承配置信息,而不是父子关系

全类名省略不写的前提时,当前bean对象的类型与继承的bean类型一致

如果需要对继承的数据进行修改,就自行对相关属性再赋值,完成值的覆盖


    <bean id="parent" class="com.timo.domain.Parent">
        <property name="name" value="ouyangfeng"/>
     </bean>
    <!--下面的parent表示这个child的bean的父亲是id=parent的这个类-->
    <bean id="child" class="com.timo.domain.Child" parent="parent">
        <property name="age" value="18"/>
     </bean>

abstract—当前bean只能被其他bean继承相关配置数据,而无法创建实例化的bean对象,不用写全类名

在这里插入图片描述
下面说的就是: 抽象bean不必映射到任何类,即不用写全类名
在这里插入图片描述


IOC容器创建时候,容器中的所有Bean对象也会随之创建,并且Bean标签就等同于new 一个Bean对象,会在创建的Bean对象的时候,调用其无参构造。

Bean的创建顺序是按照xml中配置顺序创建的

Spring 给Bean属性注入null值

在这里插入图片描述

在容器中注册一个组件(Bean标签就是组件的注册,等同于new一个Bean对象)时,同一个组件(对象)默认是单例的,容器启动完成,容器中所有组件创建完毕

IOC容器在创建组件对象的时候,如果使用Property标签对属性进行赋值,那么默认利用对象的setter属性进行赋值

javaBean对象的属性名由对象的setter方法,去掉set后面,后面的那一串首字母小写就是属性名

getBean方法的三个重置版本

getBean(people.class);//类型查找
getBean("people01");//ID查找
getBean("people01",people.class);//ID加类型查找

单例情况下演示:

  <bean id="userDao" class="com.impl.UserDaoImpl" scope="singleton"></bean>

在这里插入图片描述


多例演示:

 <bean id="userDao" class="com.impl.UserDaoImpl" scope="prototype"></bean>

在这里插入图片描述
多例模式每一次获取的对象都不相同


注意

在这里插入图片描述


Bean(对象)的生命周期配置

在这里插入图片描述
UserDaoImpl类:

package com.impl;

import com.UserDao;

public class UserDaoImpl implements UserDao {
    @Override
    public void say() {
        System.out.println("用户登录");
    }
    void init()
    {
        System.out.println("初始化中...");
    }
    void destory()
    {
        System.out.println("被销毁中....");
    }
}

配置文件:

 <bean id="userDao" class="com.impl.UserDaoImpl"  init-method="init" destroy-method="destory" ></bean>

测试类:

public class testDemo {
    public static void main(String[] args) {
        ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) app.getBean("userDao");
        System.out.println(userDao);
        //需要强转成其子类,才能调用close方法,来关闭容器
        ((ClassPathXmlApplicationContext)app).close();
    }
}

在这里插入图片描述
容器没有关闭,所以对象没有被释放,也就不会去调用销毁方法

单例Bean的生命周期: (容器启动)构造器------>初始化方法---->容器关闭(销毁方法)

多例Bean的生命周期: 获取Bean(构造器---->初始化方法)---->容器关闭不会调用Bean的销毁方法


后置处理器----在Bean初始化前面调用该方法

单例:(容器启动)构造器—>后置处理器before---->初始化方法---->后置处理器的after方法----》容器关闭(销毁方法)

无论bean是否有初始化方法,后置处理器都会默认其有,还会继续工作

//1.编写后置处理器的实现类
//2.将后置处理器注册在配置文件中
public class MyBeansProcess implements BeanPostProcessor {
    //初始化之前调用
    //Object bean: 将要初始化的bean
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName+"Bean将要调用初始化方法"+"  "+bean);
        return bean;//返回传入的bean
    }
//String beanName: bean在xml中配置的id
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName+"Bean初始化方法调用完毕"+"  "+bean);
        //初始化之后返回的是什么,容器中保存的就是什么
        return bean;
    }
}

配置文件:

<bean id="book" class="com.dhy.Factory.book"/>
<bean id="beanPostProcess" class="com.dhy.Factory.MyBeansProcess"/>

book类;

public class book {
    book()
    {
        System.out.println("book的初始化方法");
    }

    @Override
    public String toString() {
        return "图书";
    }
}

测试类:

public class main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("factory.xml");
        System.out.println(app.getBean("book"));
        if(app.getBean("book")!=null)
            System.out.println("NO");
        else
            System.out.println("YES");
    }
}

在这里插入图片描述


Bean(对象)实例化的三种方式

在这里插入图片描述

工厂静态方法实例化Bean(对象)—返回的是Bean对象,而不是工厂对象

工厂类:

public class s

以上是关于Spring入门的主要内容,如果未能解决你的问题,请参考以下文章

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

Spring boot:thymeleaf 没有正确渲染片段

What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]

Atom编辑器入门到精通 Atom使用进阶