一、简述

本文主要讲使用注解+xml配合使用的几种使用方式。基础课程请看前一节。

二、步骤

1、为Pom.xml中引入依赖:本例中使用的是spring-context包,引入此包时系统会自动导入它的依赖包spring-beans\spring-core\spring-expression\spring-context.

<?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>sindrol</groupId>
<artifactId>SpringDemo</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
</dependencies>
</project>

2、在/src/java/test2下建立下列类:

package test2;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service; @Data
@Component(value = "product1")
//@Controller("product1") //Controller也是一个Component,一般用于WEB中的Action
//@Service("product1")//Service也是一个Component,一般用于业务逻辑类
//@Repository("product1")//Repository也是一个Component,一般用于持久层类
public class Product {
@Value("Sindrol")
private String name;
@Value("1.5")
private float price;
}
package test2;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service("productOperate")
public class ProductOperate {
//使用Resource也可以实现值的注入,使用Resource和Autowired的区别在于,Resource可以指定的名称必须和要注入Comment名称相同的对象,名称不一致时出错。
@Resource(name = "product1")
private Product product;
@Autowired
private Product product2; @Override
public String toString() {
return "ProductOperate(product=" + product + " ,product2=" + product2 + ")";
}
}
package test2;

import jdk.nashorn.internal.objects.annotations.Constructor;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component; import javax.annotation.Resource;
import java.util.PrimitiveIterator; @Data
@Component("paramProduct1")
//@Scope("prototype")
@Scope("singleton")
public class ParamProduct {
@Value("JAVA书集")
private String name;
private float price;
private Product product; public ParamProduct(@Autowired Product product, @Value("Sindrol") String name, @Value("28") float price) {
this.product = product;
this.name = name;
this.price = price;
} }
package test2;

import java.util.List;

public class ConstructProduct {
private List<String> list; public ConstructProduct(List<String> list) {
this.list = list;
} @Override
public String toString() {
return "ConstructProduct(list=" + list + ")";
}
}
package test2;

import org.springframework.context.annotation.ComponentScan;

//使用ComponentScan定义类所在包开头名称。
@ComponentScan(basePackages = "test2")
public class SamePackage {
}

3、在/src/test/resources(注意:标记此resources为测试资源)下建立applicationContextTest2.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">
<!--开启注解扫描(扫描test2开头的包)-->
<context:component-scan base-package="test2"/> <!--引入配置文件,引入后值中可使用变量。引入方法一:-->
<!--<context:property-placeholder location="config.properties" file-encoding="UTF-8"/>-->
<!--引入配置文件,引入后值中可使用变量。引入方法二:-->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="config.properties" />
<property name="fileEncoding" value="UTF-8"/>
</bean> <!--扫描属性上面的注解-->
<!--<context:annotation-config></context:annotation-config>-->
<bean id="constructProduct" class="test2.ConstructProduct">
<constructor-arg>
<array>
<!--这里可以使用引入的properties文件的变量 -->
<value>${configKey1}</value>
<value>${configKey2}</value>
<value>list_item3</value>
</array>
</constructor-arg>
</bean>
</beans>

4、在/src/test/resources下建立一个名为config.properties的文件,内容如下:(这里一定要注意文件的编码,IDEA在Windows下默认新建的properties是ASCII编码,所以要转成UTF-8编码后测试。)

#这是Key:Value结构。
configKey1:this is my value1.
configKey2:柱柱

5、在/src/test/java/BeanTest下添加Junit测试方法:

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import test1.Student;
import test1.User;
import test2.*;
import test3.Bird; public class BeanTest { @Test
public void test2() {
//ApplicationContext context = new AnnotationConfigApplicationContext(SamePackage.class);
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextTest2.xml");
Product product1 = (Product) context.getBean("product1");
System.out.println(product1);
} @Test
public void test3() {
ApplicationContext context = new AnnotationConfigApplicationContext(SamePackage.class);
ParamProduct paramProduct1 = (ParamProduct) context.getBean(ParamProduct.class, new Object[]{ //构造函数值
context.getBean(Product.class),
"Product初始名字",
23
});
System.out.println(paramProduct1);
ParamProduct paramProduct2 = (ParamProduct) context.getBean(ParamProduct.class, new Object[]{ //构造函数值
context.getBean(Product.class),
"Product初始名字2",
333
});
System.out.println(paramProduct2); //注意,paramProduct2并未进行真实的构造,而是直接取了单例对象。
System.out.println("是否是同一实例:" + (paramProduct1 == paramProduct1));
} @Test
public void test4() {
ApplicationContext context = new AnnotationConfigApplicationContext(SamePackage.class);
ProductOperate productOperate = context.getBean(ProductOperate.class);
System.out.println(productOperate);
} @Test
public void test5() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextTest2.xml");
ConstructProduct constructProduct = context.getBean(ConstructProduct.class);
System.out.println(constructProduct);
} }

6、执行测试,查看测试结果:

test2测试结果:

Product(name=Sindrol, price=1.5)

test3测试结果:

五月 06, 2018 12:40:40 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@10e92f8f: startup date [Sun May 06 12:40:40 CST 2018]; root of context hierarchy
ParamProduct(name=JAVA书集, price=28.0, product=Product(name=Sindrol, price=1.5))
ParamProduct(name=JAVA书集, price=28.0, product=Product(name=Sindrol, price=1.5))
是否是同一实例:true

test4测试结果:

五月 06, 2018 12:40:40 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@67a20f67: startup date [Sun May 06 12:40:40 CST 2018]; root of context hierarchy
五月 06, 2018 12:40:40 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@31368b99: startup date [Sun May 06 12:40:40 CST 2018]; root of context hierarchy
五月 06, 2018 12:40:40 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContextTest2.xml]
ProductOperate(product=Product(name=Sindrol, price=1.5) ,product2=Product(name=Sindrol, price=1.5))

test5测试结果:

ConstructProduct(list=[this is my value1., 柱柱, list_item3])

三、测试属性文件以Map的形式载入

1、在/src/test/java/test3下建立一个Bird类

package test3;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import java.util.Map; @Component
public class Bird {
@Value("#{configProperties['configKey2']}")
private String configKey2;
@Value("#{configProperties}")
private Map<String, String> properties; @Override
public String toString() {
return "Bird(properties=" + properties + ",configKey2=" + configKey2 + ")";
}
}

2、在/src/test/resources下建立一个applicationContextTest3.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">
<context:component-scan base-package="test3"/>
<bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>*.properties</value>
</list>
</property>
<property name="fileEncoding" value="UTF-8"/>
</bean>
</beans>

3、在/src/test/java/BeanTest中添加test6测试方法:

    @Test
public void test6() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextTest3.xml");
Bird bird = context.getBean(Bird.class);
System.out.println(bird);
}

4、运行查看结果:

五月 06, 2018 12:40:41 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@795cd85e: startup date [Sun May 06 12:40:41 CST 2018]; root of context hierarchy
五月 06, 2018 12:40:41 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContextTest3.xml]
Bird(properties={configKey1=this is my value1., #这是Key=Value结构。, configKey2=柱柱},configKey2=柱柱)

使用Spring框架入门二:基于注解+XML配置的IOC/DI的使用的更多相关文章

  1. Spring框架入门之基于Java注解配置bean

    Spring框架入门之基于Java注解配置bean 一.Spring bean配置常用的注解 常用的有四个注解 Controller: 用于控制器的注解 Service : 用于service的注解 ...

  2. 深入学习Spring框架(二)- 注解配置

    1.为什么要学习Spring的注解配置? 基于注解配置的方式也已经逐渐代替xml.所以我们必须要掌握使用注解的方式配置Spring. 关于实际的开发中到底使用xml还是注解,每家公司有着不同的使用习惯 ...

  3. Spring框架入门之基于xml文件配置bean详解

    关于Spring中基于xml文件配置bean的详细总结(spring 4.1.0) 一.Spring中的依赖注入方式介绍 依赖注入有三种方式 属性注入 构造方法注入 工厂方法注入(很少使用,不推荐,本 ...

  4. 使用Spring框架入门一:基于XML配置的IOC/DI的使用

    一.Spring框架 1.方法一:逐项导入基础依赖包: spring-core.spring-beans.spring-context.spring-expression 2.方法二:最简洁的导入,直 ...

  5. SpringMVC的入门示例---基于注解的配置

    注解版的配置,主要的修改就是将原来使用<bean>创建的业务控制器对象,修改为是扫描标签扫描到容器. 1.导入包 2.在 web.xml 配置核心控制器 <?xml version= ...

  6. Spring Security入门(基于SSM环境配置)

    一.前期准备 配置SSM环境 二.不使用数据库进行权限控制 配置好SSM环境以后,配置SpringSecurity环境 添加security依赖   <dependency> <gr ...

  7. Spring框架零基础学习(一):IOC|DI、AOP

    文章目录 一.IDEA创建Spring项目 二.Spring: IOC和DI 三.Spring: AOP 参考链接: HOW2J.CN:Spring idea创建一个spring项目 一.IDEA创建 ...

  8. [译]16-spring基于注解的配置元数据

    从spring2.5起spring框架开始支持java注解的配置元数据.所以除了使用xml配置文件来描述bean的装配之外,你还 可以使用基于java注解的配置元数据来完成同样的功能. spring框 ...

  9. 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

    前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...

随机推荐

  1. Xcode 统计项目代码行数及常用快捷键

    1.统计Xcode项目代码行数 1   打开终端. 2  用ls和cd进到你项目的路径. 3   输入下面的指令: grep -r "\n" classes | wc -l (cl ...

  2. 黑吃黑第一季/全集Banshee迅雷下载

    第一季 Banshee Season 1 (2013)看点:“Banshee”在爱尔兰盖尔语中被称为“bean sidhe”,意思是“拥有超能力的女人”.不过在鲍尔的新剧中,Banshee并不是指超自 ...

  3. Kubeadm安装Kubernetes环境

    Kubeadm方式号称一键安装部署,很多人也试过并且顺利成功,可到了我这里因为折腾系统问题,倒腾出不少的坑出来. kubeadm好处是自动配置了必要的服务,以及缺省配置了安全的认证,etcd,apis ...

  4. java转义符和正则表达式转义符

    举例来说,连续相同的3位数字的正则表达式的标准语法是: ([\d])\1{2} 但是如果在java代码中这么写,就会出现语法错误,如下: String regEx = "([\d])\1{2 ...

  5. Keras教程

    In this step-by-step Keras tutorial, you’ll learn how to build a convolutional neural network in Pyt ...

  6. cross validation笔记

    preface:做实验少不了交叉验证,平时常用from sklearn.cross_validation import train_test_split,用train_test_split()函数将数 ...

  7. [转]MCC(移动国家码)和 MNC(移动网络码)

    From : http://blog.chinaunix.net/uid-20484604-id-1941290.html     国际移动用户识别码(IMSI) international mobi ...

  8. 利用ASP.NET运行数据库的安装脚本

    在启明星的演示站点里,经常有用户修改演示密码,导致别的用户无法访问. 为此,在登陆页面,增加了一个“初始化数据库”功能,这样,即使用户修改了密码,别的访问者,只要重置数据库,就可以很容易再次进入. 首 ...

  9. perf使用示例2

    perf使用示例2 性能调优工具如 perf,Oprofile 等的基本原理都是对被监测对象进行采样,最简单的情形是根据 tick 中断进行采样,即在 tick 中断内触发采样点,在采样点里判断程序当 ...

  10. 用java打暴雪星际争霸(2)——执行測试机器人

    原创内容.转载请注明. 在上一节安装完成后.或者您直接打开我分享的虚拟机后,我如今将解说怎样启动測试机器人. 第一步,打开Eclipse,导入机器人演示样例项目,如图所看到的. 第二步,我们能够看到就 ...