Spring是一个基于IOC和AOP的结构J2EE系统的框架。
IOC 反转控制 是Spring的基础,Inversion Of Control
简单说就是以前创建对象由程序员自己new 构造方法来调用,变成了交由Spring创建对象。DI 依赖注入 Dependency Inject. 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接使用即可。
打个比喻:
传统方式:相当于你自己去菜市场new 了一只鸡,不过是生鸡,要自己拔毛,去内脏,再上花椒,酱油,烤制,经过各种工序之后,才可以食用。
用 IOC:相当于去馆子(Spring)点了一只鸡,交到你手上的时候,已经五味俱全,你就只管吃就行了。
IOC是反转控制 (Inversion Of Control)的缩写,就像控制权从本来在自己手里,交给了Spring。
本知识点通过运行TestSpring演示如何用Spring获取一个对象,并打印其name
项目结构图:
pom.xml
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.Spring.test</groupId>
<artifactId>Spring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- spring依赖项 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>com.springsource.org.aspectj.weaver</artifactId>
<version>1.6.4.RELEASE</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
</project>
User.java
package Spring.entity;
public class User {
private int id;
private String name;
private int age;
private Address address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
Address,java
package Spring.entity;
public class Address {
private String province;
private String city;
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return ""+province + "" + city;
}
}
beans.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean name="User" class="Spring.entity.User">
<property name="id" value="1" />
<property name="name" value="小明" />
<property name="age" value="18" />
<property name="address" ref="Address"/><!---在创建User的时注入一个address对象,注意:这里要使用ref来注入另一个对象-->
</bean>
<bean name="Address" class="Spring.entity.Address">
<property name="province" value="湖北" />
<property name="city" value="武汉" />
</bean>
</beans>
Test.java
package Spring.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import Spring.entity.User;
public class Test {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext(new String[] {"beans.xml"});
User u=(User)context.getBean("User");
System.out.println("用户ID:"+u.getId()+" 姓名 :"+u.getName()+" 年龄: "+u.getAge()+" 他来自"+u.getAddress());
}
}
运行Test类
那么如何使用注解的方式完成注入对象中的效果?
1.在beans.xml中添加<context:annotation-config/>
告诉Spring要用注解的方式进行配置,并注释掉<property name="address" ref="Address"/>
。这个行为在后面将使用注解来完成
2.在User.java的address属性前加上@Autowired注解
除了前面的 在属性前加上@Autowired 这种方式外,也可以在setAddress方法前加上@Autowired,这样来达到相同的效果。
除了@Autowired之外,@Resource也是常用的手段
上述例子是对注入对象行为的注解,那么bean对象本身,比如Category,Product可不可以移出applicationContext.xml配置文件,也通过注解进行呢?接下来就讲解如何对Bean进行注解配置
修改beans.xml,什么都去掉,只新增:
<context:component-scan base-package="Spring.entity"/>
其作用是告诉Spring,bean都放在 Spring.entity 这个包下
为User类加上@Component注解,即表明此类是bean
@Component(“User”)
为Address 类加上@Component注解,即表明此类是bean
@Component(“Address”)
另外,因为配置从beans.xml中移出来了,所以属性初始化放在属性声明上进行了
运行结果是一样的。