Spring框架(1)——IOC(控制权反转)的实现
目录
编辑
什么是Spring框架
创建对象
1.新建项目
2.导入坐标依赖
3.编写一个测试Demo
4.编写测试方法
注入属性
1.依赖注入的概述
过程1:利用Set/Get注入
过程2:利用属性构造方法方式注入值
什么是Spring框架
Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE.
它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。
Spring的核心是控制反转(IOC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。
IOC:控制权反转
在Java当中创建对象的方式:new关键字,反射。而IOC就是把创建对象的过程交给Spring框架。
Spring实现IOC原理
实现IOC——利用反射的形式把创建对象的权限交给Spring
public static void main(){ Class clazz=Class.froName("全类名"); clazz.newInstance(); }
我们把文件的全类名放在一个xml配置文件中,只要上面这个main方法读取到xml里的值,Spring框架就能自动成对象。
AOP:面向切面编程
在不改变源代码的情况之下,对代码功能进行增强。
下面我将介绍如何通过xml的方式实现创建对象和注入属性
创建对象
1.新建项目
新建项目——选择maven项目
2.导入坐标依赖
创建maven工程,导入坐标依赖,这样整个项目就变为一个Spring的项目了。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
3.编写一个测试Demo
在main.java下创建一个类,编写一个具体实现的方法
package com.qcby.service;
public class Demo {
public void run() {
System.out.println("hello world");
}
}
编写Spring核心的配置文件,在resources目录下创建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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--IOC管理bean-->
<!--id:类的唯一标识符 class:类的全路径名-->
<bean id="demo" class="com.qcby.service.Demo" />
</beans>
4.编写测试方法
创建Test类
package Test;
import com.qcby.service.Cat;
import com.qcby.service.Demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
//传统写法
@org.junit.Test
public void test1(){
Demo demo = new Demo();
demo.run();
}
@org.junit.Test
public void test2(){
ApplicationContext context=new ClassPathXmlApplicationContext("Spring.xml");
Demo demo = (Demo) context.getBean("demo");
demo.run();
}
}
测试结果如下:
补充!!Spring对对象的一种管理
Spring对bean的管理管理方式
1.基于xml配置的形式实现
2.通过注解的方式实现
实现功能
1.创建对象
2.注入属性
注入属性
1.依赖注入的概述
IOC和DI的概念
IOC:Inverse of Control,控制反转,将对象的创建权反转给Spring
DI:Dependency Injection,依赖注入,就是注入属性
过程1:利用Set/Get注入
属性的set方法注入值:编写属性,提供该属性对应的set方法,编写配置文件完成属性值的注入
Demo类
package com.qcby.service;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Demo {
// 编写成员属性,一定需要提供该属性的set方法
//IOC容器底层就通过属性的set方法方式注入值
private String name;
private int age;
private Cat cat;
private String[] strings;
private List<String> list;
private Map<String,String> map;
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 Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public String[] getStrings() {
return strings;
}
public void setStrings(String[] strings) {
this.strings = strings;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
@Override
public String toString() {
return "Demo{" +
"name='" + name + '\'' +
", age=" + age +
", cat=" + cat +
", strings=" + Arrays.toString(strings) +
", list=" + list +
", map=" + map +
'}';
}
}
xml文件
关键标签为property
<bean id="demo" class="com.qcby.service.Demo" >
<!--使用property完成属性注入
name:类里面属性名称
value:向属性注入值
ref:对象映射
-->
<property name="name" value="张三"/>
<property name="age" value="19"/>
<property name="cat" ref="cat"/>
<property name="strings">
<array>
<value>aa</value>
<value>bb</value>
<value>cc</value>
</array>
</property>
<property name="list">
<list>
<value>dd</value>
<value>ee</value>
</list>
</property>
<property name="map">
<map>
<entry key="aa" value="老王"/>
<entry key="bb" value="老张"/>
</map>
</property>
</bean>
注意!!数组,集合(List,Set,Map)等的set注入
<property name="strs"> <array> <value>美美</value> <value>小凤</value> </array> </property> <property name="list"> <list> <value>熊大</value> <value>熊二</value> </list> </property> <property name="map"> <map> <entry key="aaa" value="老王"/> <entry key="bbb" value="小王"/> </map> </property>
Test类:
@org.junit.Test
public void test2(){
ApplicationContext context=new ClassPathXmlApplicationContext("Spring.xml");
Demo demo = (Demo) context.getBean("demo");
System.out.println(demo.toString());
}
}
过程2:利用属性构造方法方式注入值
属性构造方法方式注入值:对于类成员变量,构造函数注入
Cat类
我们生成了一个构造函数
package com.qcby.service;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Cat {
private String name;
private Double money;
private String[] strings;
private List<String> list;
private Map<String,String> map;
public Cat(String name, Double money, String[] strings, List<String> list, Map<String, String> map) {
this.name = name;
this.money = money;
this.strings = strings;
this.list = list;
this.map = map;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", money=" + money +
", strings=" + Arrays.toString(strings) +
", list=" + list +
", map=" + map +
'}';
}
public void run(){
System.out.println("小猫跑得很快");
}
}
xml文件
关键标签变为constructor-arg
<bean id="cat" class="com.qcby.service.Cat">
<constructor-arg name="name" value="张三"/>
<constructor-arg name="money" value="100.5"/>
<constructor-arg name="strings">
<array>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</array>
</constructor-arg>
<constructor-arg name="list">
<list>
<value>ddd</value>
<value>eee</value>
</list>
</constructor-arg>
<constructor-arg name="map">
<map>
<entry key="aaa" value="老王"/>
<entry key="bbb" value="老张"/>
</map>
</constructor-arg>
</bean>
注意!!数组,集合(List,Set,Map)等的set注入
<constructor-arg index="0"> <array> <value>aaa</value> <value>bbb</value> <value>ccc</value> </array> </constructor-arg> <constructor-arg index="1"> <list> <value>小黑</value> <value>小白</value> </list> </constructor-arg> <constructor-arg index="2"> <map> <entry key="aaa" value="小黑"/> <entry key="bbb" value="小号"/> </map> </constructor-arg>
Test类
@org.junit.Test
public void test2(){
ApplicationContext context=new ClassPathXmlApplicationContext("Spring.xml");
Cat cat=(Cat) context.getBean("cat");
System.out.println(cat.toString());
}