Spring(三)

从配置文件中读取内容

bean命名空间

    <!--load properties-->
    <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="location" value="DruidUtils.properties"/>
    </bean>

    <bean class="com.alibaba.druid.pool.DruidDataSource" name="dataSource">
		<!--获取配置文件中的值,表达式为${key}-->
        <property name="url" value="${jdbc.jdbcUrl}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

context命名空间

    <!--load properties
		location值为参数配置文件的位置
	-->
    <context:property-placeholder location="DruidUtils.properties"/>

    <bean class="com.alibaba.druid.pool.DruidDataSource" name="dataSource">
        <property name="url" value="${jdbc.jdbcUrl}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

注解配置spring

xml文件约束

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!--
    扫描cn.Pu1satilla.domain文件下所有类的注解
    注意:扫描包时,会扫描包下的所有子孙包
    -->
    <context:component-scan base-package="cn.Pu1satilla.domain"/>
</beans>

将对象注册到容器

在xml配置下原型为:

<bean name="user" class="cn.Pu1satilla.domain.User">

注解位置

位于类上方

普通注解

@Component("user")

分层注解

//		service层
@Service("user")

//		web层
@Controller("user")

//		dao层
@Repository("user")

修改对象的作用范围(scope)

在xml配置下原型为:

<bean name="user0" class="cn.Pu1satilla.domain.User" scope="prototype"/>

注解位置

位于类上方

注解格式

@Scope("prototype")

值类型注入

反射注入

通过反射的Field赋值,破坏了封装性

@Value("tom")
private String name;
@Value("18")
private Integer age;

set注解注入

通过set方法赋值,推荐使用

@Value("Lucy")
public void setName(String name) {
	this.name = name;
}

@Value("18")
public void setAge(Integer age) {
	this.age = age;
}

引用类型注入

自动装配

@Autowired
private Cat cat;

但是如果容器中出现了多个cat,那么无法选择具体注入是哪一个cat,这时就需要指定装配

指定装配

@Autowired
@Qualifier("cat1")
private Cat cat;

手动注入(建议)

直接告诉spring装配给定对象

@Resource(name = "cat1")
private Cat cat;

初始化|销毁方法

在xml配置下原型为:

<bean name="user" class="cn.Pu1satilla.domain.User" destroy-method="destroy" init-method="init"/>

注解配置:

@PostConstruct  //在对象在构造后调用
public void init(){
	System.out.println("user被初始化");
}

@PreDestroy  //对象销毁之前调用(在多例模式下无法调用)
public void destroy(){
	System.out.println("user被销毁");
}

spring整合junit

配置注解

//由注解创建容器
@RunWith(SpringJUnit4ClassRunner.class)
//指定创建容器时使用配置文件
@ContextConfiguration("classpath:applicationContext.xml")

测试用例

package cn.Pu1satilla.demo;

import cn.Pu1satilla.domain.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

//由注解创建容器
@RunWith(SpringJUnit4ClassRunner.class)
//指定创建容器时使用配置文件
@ContextConfiguration("classpath:applicationContext.xml")

public class JunitSpringDemo {

    @Resource(name = "user")
    private User user;

    @Test
    public void demo1() {
        System.out.println(user);
    }
}