Spring简要入门

网课笔记

1. 三种装配方式

  1. 自动装配
  2. Java装配
  3. XML装配

1.1. 自动装配

@Autowired { 自动注入 ,可利用直接助于类成员中(利用反射效率低)

(required = false) 忽略当前要注入的bean,如果有直接注入,如果没有跳过。

}

@Component { @Service(服务) @Repository(DAO) @Controller(控制)}

@Configuration { 一般注在配置类 }

@ComponentScan(“com.xxx.xx”){ 包名为扫描范围,一般注在配置类,自动注释中配置类可以为空 }

对于ComponentScan的还有一种解决办法是在applicationContext中添加

<context:component-scan base-package="com.vaxtomis.ssp4"/>

@Qualifier(“”){ 表明需要的类的名称,可以用于解决实现同一接口的多个类在绑定过程中出现冲突的情况。 }

@RunWith(.class){ 运行器,可以指定测试环境(比如指定log4j) }

@Test { 用于标注Junit单元测试中测试方法 }

1.2. Java装配

@ContextConfiguration(classes = .class){ 一般为主要负责配置类,AppConfig.class }

@Bean { 在装配类中标注}

public class UserDaoNormal implements UserDao {
    @Override
    public void add() {
        System.out.println("添加用户到数据库中......");
    }
}
public class UserServiceNormal implements UserService {
    private UserDao userDao;

    public UserServiceNormal() {
        super();
    }

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

    @Override
    public void add() {
        userDao.add();
    }
}
public class AppConfig {
    @Bean
    public UserDao userDaoNormal(){
        System.out.println("创建UserDaoNormal对象");
        return new UserDaoNormal();
    }
    @Bean
    //这里使用Qualifier区别
    public UserService userServiceNormal(@Qualifier("userDaoNormal") UserDao userDao){
        System.out.println("创建UserService对象");
        UserServiceNormal userService = new UserServiceNormal();
        userService.setUserDao(userDao);
        return userService;
    }
    @Bean
    public UserDao userDaoCache(){
        System.out.println("创建UserDaoCache对象");
        return new UserDaoCache();
    }
}

1.3. XML装配

XML装配较为繁杂,可能贴上一大堆代码以便理解。

首先,要使用xml装配要修改

@ContextConfiguration(“classpath: applicationContext.xml”)

在resource中建立 applicationContext.xml

以下代码结构为

建立Music,CompactDisc,CDPlayer三个类。

Music{String title,int duration}

CompactDisc{String title,String artist,Music[] tracks}

CDPlayer{CompactDisc cd}

实现了get set函数。其中CompactDisc中含有Music类,CompactDisc的play()方法会输出CD的信息和每一首歌的title、duration。

CDPlayer含有CompactDisc,并会调用CompactDisc的play()方法最终对信息进行输出。

贴上.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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.xsd">
    <bean id="music1" class="com.vaxtomis.ssp6.Music">
        <!--title和duration是属性而不是私有的成员变量
        属性和私有成员变量的区别:属性是set方法名中set后的内容的小写名称-->
        <property name="title" value="告白气球"/>
        <property name="duration" value="215"/>
     </bean>
    <bean id="music2" class="com.vaxtomis.ssp6.Music" p:title="爱情废柴" p:duration="305"/>
    <!--使用p名称非引用为title(数据类型),引用为title-ref-->
    <util:list id="trackList">
        <ref bean="music1"/>
        <ref bean="music2"/>
    </util:list>
    <bean id="compactDisc1" class="com.vaxtomis.ssp6.CompactDisc" p:title="周杰伦的床边故事"
    p:artist="周杰伦" p:tracks-ref="trackList">
        <!--<property name="title" value="周杰伦的床边故事"/>
        <property name="artist" value="周杰伦"/>-->
        <!--<property name="tracks">
            <array>
                <ref bean="music1"/>
                <ref bean="music2"/>
            </array>
        </property>-->
    </bean>
    <bean id="CDPlayer1" class="com.vaxtomis.ssp6.CDPlayer">
        <property name="cd" ref="compactDisc1"/>
    </bean>
</beans>

<bean>代表需要装配类;id 名称;class 类名;p:title 输入非引用数据类型

p:tittle-ref 输入引用数据类型,需要引入

xmlns:p="http://www.springframework.org/schema/p"

<constructor-arg>装配类中的成员变量,通过构造函数方法注入

<property>装配类中的成员变量,通过setter对应方法注入

<array>数组

<map><entry key=”” value=””></entry></map>

<set></set>集合

<ref>引用类型

上部分代码内容的运行结果

通过上部分的运行结果不难看出,Spring的装载顺序是先按照结构定位到最底层的类,建立实例之后再将底层类注入到上一级类中,最后完成函数调用。

2. 入门

  1. 初始化Spring容器,无论是否主动获取bean对象,Spring上下文一加载就会创建bean对象。
  2. 无论注入多少次,拿到的都是同一个对象(单例)

2.1. Bean的作用域

  • 单例(Singleton) 只创建一个bean实例
  • 原型(Prototype)每次都会创建一个新的bean的实例
  • 会话(Session)在Web应用中,为每个会话创建一个bean实例
  • 请求(Request)为每个请求创建一个bean实例

scope = “singleton” 情况下:

  1. 初始化Spring容器,无论是否主动获取bean对象,Spring上下文一加载就会创建bean对象。
  2. 无论注入多少次,拿到的都是同一个对象

scope = “prototype” 情况下:

  1. 没有获取对象的情况下,bean的实例不会被创建。
  2. 只有获取bean对象时,才会创建bean的实例,并且每个实例都不同。

xml装配模式下:

<bean id="notepad" class="com.vaxtomis.test.Notepad" scope="prototype"/>

自动装配模式下:

@Component
@Scope("prototype")

Java装配模式下:

@Bean
@Scope("prototype")

2.2. 按需加载和积极加载

在scope=”singleton”模式下,Spring的加载策略默认为积极加载。如果想要改成按需加载(即并非在上下文加载时创建对象,而是在有需求时创建)

按需加载的设置

xml装配模式下:

<bean id="notepad" class="com.vaxtomis.test.Notepad" scope="singleton" lazy-init="true"/>

自动装配模式下:

@Component
@Scope("singleton")
@Lazy

Java装配模式下:

@Bean
@Scope("singleton")
@Lazy

2.3. 初始化方法和销毁方法

xml装配模式下:

<bean id="notepad2" class="com.vaxtomis.test.Notepad2" scope="singleton" lazy-init="true"
init-method="init" destroy-method="destroy"/>

自动装配模式下:

@PostConstruct
public void init(){
    System.out.println("Notepad2初始化方法......");
}
@PreDestroy
public void destroy(){
    System.out.println("Notepad2销毁方法......");
}

Java装配模式下:

@Bean(initMethod = "init",destroyMethod = "destroy")

特别注意,在JDK大于11版本中,没有自动装配所需的javax.annotation包,需要在pom.xml中添加依赖

<dependency>
	<groupId>javax.annotation</groupId>
	<artifactId>javax.annotation-api</artifactId>
	<version>1.3.1</version>
</dependency>

2.4. 工厂

静态工厂和实例工厂

public class PersonFactory {
    //静态工厂方法
    public static Person createPerson(){
        System.out.println("静态工厂创建Person......");
        return new Person();
    }
    //实例工厂方法
    public Person createPerson2(){
        System.out.println("实例工厂创建Person......");
        return new Person();
    }
}
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--静态工厂-->
    <bean id="person1" class="com.vaxtomis.ssp8.PersonFactory" factory-method="createPerson"/>
    <!--实例工厂-->
    <bean id="personFactory" class="com.vaxtomis.ssp8.PersonFactory"/>
    <bean id="person2" factory-bean="personFactory" factory-method="createPerson2"/>
</beans>