本偏主要介绍spring的基本使用。
首先创建好maven工程。导入一下jar包
<dependencies>
<!-- spring 容器包导入 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!-- spring 测试支持包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.9.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- 日志支持-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.28</version>
</dependency>
然后创建包、类和测试的xml文件。
首先xml的配置文件及说明
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- spring Context 自动扫描包 context标签解析类ContextNamespaceHandler springcontext下的spring.hendlers中定义的标签解析类 -->
<context:component-scan base-package="com.wsj.spring">
</context:component-scan>
<!--
(1) id:Bean的唯一标识名。它必须是合法的XMLID,在整个XML文档中唯一。
(2)、name:用来为id创建一个或多个别名。它可以是任意的字母符合。多个别名之间用逗号或空格分开。
(3)、class:用来定义类的全限定名(包名+类名)。只有子类Bean不用定义该属性。
(4)、parent:子类Bean定义它所引用它的父类Bean。这时前面的class属性失效。子类Bean会继承父类Bean的所有属性,子类Bean也可以覆盖父类Bean的属性。注意:子类Bean和父类Bean是同一个Java类。
(5)、abstract(默认为”false”):用来定义Bean是否为抽象Bean。它表示这个Bean将不会被实例化,一般用于父类Bean,因为父类Bean主要是供子类Bean继承使用。
(6)、scope:定义Bean是否是作用域。singleton/prototype/session、request,和自定义SCOPE。默认为:singleton。在BeanFactory作用范围内,只维护此Bean的一个实例。如果设Prototype(原型)状态,BeanFactory将为每次Bean请求创建一个新的Bean实例,不会对实例进行缓存。request和session是web容器自定义的scope。
(7)、lazy-init(默认为“default”):用来定义这个Bean是否实现懒初始化。如果为“true”,它将在BeanFactory启动时初始化所有的SingletonBean。反之,如果为“false”,它只在Bean请求时才开始创建SingletonBean。
(8)、autowire(自动装配,默认为“default”):它定义了Bean的自动装载方式。
1、“no”:不使用自动装配功能。
2、“byName”:通过Bean的属性名实现自动装配。
3、“byType”:通过Bean的类型实现自动装配。
4、“constructor”:类似于byType,但它是用于构造函数的参数的自动组装。
5、“autodetect”:通过Bean类的反省机制(introspection)决定是使用“constructor”还是使用“byType”。
(9)、dependency-check(依赖检查,默认为“default”):它用来确保Bean组件通过JavaBean描述的所以依赖关系都得到满足。在与自动装配功能一起使用时,它特别有用。
1、none:不进行依赖检查。
2、objects:只做对象间依赖的检查。
3、simple:只做原始类型和String类型依赖的检查
4、all:对所有类型的依赖进行检查。它包括了前面的objects和simple。
(10)、depends-on(依赖对象):这个Bean在初始化时依赖的对象,这个对象会在这个Bean初始化之前创建。
(11)、init-method:用来定义Bean的初始化方法,它会在Bean组装之后调用。它必须是一个无参数的方法。
(12)、destroy-method:用来定义Bean的销毁方法,它在BeanFactory关闭时调用。同样,它也必须是一个无参数的方法。它只能应用于singletonBean。
(13)、factory-method:定义创建该Bean对象的工厂方法。它用于下面的“factory-bean”,表示这个Bean是通过工厂方法创建。此时,“class”属性失效。
(14)、factory-bean:定义创建该Bean对象的工厂类。如果使用了“factory-bean”则“class”属性失效。
(15)、autowire-candidate:采用xml格式配置bean时,将<bean/>元素的autowire-candidate属性设置为false,这样容器在查找自动装配对象时,将不考虑该bean,即它不会被考虑作为其它bean自动装配的候选者,但是该bean本身还是可以使用自动装配来注入其它bean的。 -->
<!-- 初始化方法,和销毁前执行的方法 -->
<bean id="initDestoryTest" class="com.wsj.spring.bean.PropertyClass" init-method="initMehtod" destroy-method="destroyMethod"/>
<!-- 下面俩个bean定义的类中并无父子继承关系,使用spring的parent标签使其变成父子类。其中父类定义为 abstract 不会被容器实例化-->
<bean id="parent" class="com.wsj.spring.bean.Parent" abstract="true">
<property name="username" value="parent name"/>
</bean>
<!-- 这里演示了属性的注入,和依赖注入 以及spring中bean父子合并 -->
<bean id="son" class="com.wsj.spring.bean.Son" parent="parent" lazy-init="false" autowire-candidate="false" autowire="byName">
<!--<property name="username" value="son name"/> 这里的这个属性可以用 @Value("18") 代替 -->
<property name="age" value="18"/>
</bean>
<bean id="mySon" class="com.wsj.spring.bean.MySon">
<!-- 基于属性注入 可用 @Autowired/@Resource注解替代 -->
<property name="mySon" ref="son"/>
</bean>
<!--lookUp的使用示例 -->
<bean id="lookUpSayHello" class="com.wsj.spring.bean.LookUpSayHello">
<!-- 等价于@Lookup(value = "sayHelloB") -->
<lookup-method name="getSayHello" bean="sayHelloB"></lookup-method>
</bean>
<bean id="sayHelloA" class="com.wsj.spring.bean.SayHelloA">
</bean>
<bean id="sayHelloB" class="com.wsj.spring.bean.SayHelloB">
</bean>
<!-- 使用factoryBean创建实例-->
<bean id="testFactionBean" class="com.wsj.spring.bean.MyFactoryBean" >
<meta key="key" value="test"/><!-- spring中的属性配置 -->
</bean>
<bean id="propertyBean" class="com.wsj.spring.bean.PropertyClass" factory-bean="testFactionBean" factory-method="factoryMethod"></bean>
</beans>
下面为bean的Java类文件及说明
这个是用于后面的循环依赖的测试bean
package com.wsj.spring.bean;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Data
@Service
public class CircularRefB {
@Value("xxxk")
private String username;
@Autowired
private CircularRefA circularRefA;
}
package com.wsj.spring.bean;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
/**
* 循环依赖问题
*/
@Data
@Service
public class CircularRefA {
@Value("123")
private String username;
@Autowired
private CircularRefB circularRefB;
}
这段代码时测试lookup的
package com.wsj.spring.bean;
public interface SayHello {
public void sayHello();
}
package com.wsj.spring.bean;
public class SayHelloA implements SayHello {
public void sayHello() {
System.out.println("A say hello!!s");
}
}
package com.wsj.spring.bean;
public class SayHelloB implements SayHello {
public void sayHello() {
System.out.println("B say hello");
}
}
package com.wsj.spring.bean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Lookup;
import javax.annotation.Resource;
public class LookUpSayHello {
@Resource(name = "sayHelloA")
SayHello sayHello;
// @Lookup(value = "sayHelloB")
public SayHello getSayHello() {
// return new SayHelloA();
sayHello.sayHello();
return sayHello;
}
public void sayHello(){
getSayHello().sayHello();
sayHello.sayHello();
System.out.println("LookUpTest.sayHell");
}
}
这段代码是用于演示bean实例化完成后初始化方法,和销毁前执行的方法
package com.wsj.spring.bean;
public class PropertyClass {
public String initMehtod() {
System.out.println("=======initMethod========");
return "";
}
public void destroyMethod() {
System.out.println("=======destroyMethod========");
}
}
这段代码是演示spring父子bean继承,和以来注入的 属性注入,和引用注入
package com.wsj.spring.bean;
import org.springframework.beans.factory.annotation.Value;
public class Son {
private String username;
// @Value("18")
private int age;
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public void initMethod(){
System.out.println("执行了Son.initMethod方法");
}
public void destroyMethod(){
System.out.println("执行了Son.destroyMethod方法");
}
public Son(){
System.out.println("执行了Son的构造方法");
}
}
package com.wsj.spring.bean;
public class Parent {
private String username;
private int age;
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.wsj.spring.bean;
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.Resource;
public class MySon {
// @Autowired
// @Resource
private Son mySon;
public void print(){
System.out.println("MySon的名字:"+mySon.getUsername()+"今年:"+mySon.getAge()+"岁了");
}
public Son getMySon() {
return mySon;
}
public void setMySon(Son mySon) {
this.mySon = mySon;
}
}
下面这段代码演示的是factory'Bean的xml配置方式的使用
package com.wsj.spring.bean;
import com.wsj.spring.bean.PropertyBean;
public class MyFactoryBean {
public Object factoryMethod(/*String id,List param*/) {
System.out.println("=========factoryMethod=========");
return new PropertyBean();
}
}
package com.wsj.spring.bean;
import lombok.Data;
@Data
public class PropertyBean {
private String username;
private String password;
}
测试代码这里我没有使用spring-test功能,为了方便后续的调试跟源码
package com.wsj.spring;
import com.wsj.spring.bean.LookUpSayHello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
ApplicationContext app=new ClassPathXmlApplicationContext("test.xml");
LookUpSayHello bean = app.getBean(LookUpSayHello.class);
bean.sayHello();
}
}