Spring是一个轻量级控制反转IoC和面相切面AOP的容器框架。目的是为了解决企业应用开发的复杂性。
IOC: 控制反转invision of control
本质就是设置接口,即set方法是一种抽象思想。
他是一种设计思想。根据这个思想有实现的方式,DI:(Dependency Injection)依赖注入。
反转了什么?原来由我们程序猿主动控制的程序到由用户给我们传递,我们来接收。由编写代码到编写接口。编写代码,程序按照代码顺序走,编写接口,程序具有配置性和动态性。
作用:让程序的耦合性大大降低,提高灵活性,降低编码难度,可移植性更高。方便模块独立,到后来发展为微服务。
微服务就是把一个一块的模块分解开来,比如支付登录注册这些在一个系统就写完了。后来分模块写,全部分开之后一个一个服务独立分配就叫微服务。本质就是解耦。
实现HelloSpring:
1.导jar包:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependenies>
2.创建一个实体类:
package com.duan.pojo;
public class Hello {
private String name;
public Hello() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("Hello"+name);
}
@Override
public String toString() {
return "Hello{" +
"name='" + name + '\'' +
'}';
}
}
3.写Spring配置文件:
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--bean就是一个java对象,由Spring管理和创建-->
<bean id="hello" class="com.duan.pojo.Hello">
<property name="name" value="Spring"/>
</bean>
<!--用户调hello请求,Spring拿到分析xml文件我有这个id,并且找到对应了的类,给它new出来-->
<!--Hello hello = new Hello();-->
<!--new出来后在这个property属性,找name的set大写Name方法set value这个值-->
<!--hello.setName (Spring)-->
<!--经过这两步你的hello就有值了,于是就给你返回回来,你就可以用了-->
</beans>
4.测试类:
package com.duan.pojo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloTest {
@Test
public void test(){
//解析beans.xml配置文件,生产管理相应的Bean对象;
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//通过Bean得到这个对象的实体
Hello hello = (Hello)context.getBean("hello");
hello.show();
}
}
思考:
- Hello对象是由谁创建的?
- 之前通过Hello hello= new Hello(),现在对象是由Spring创建的。
<!-- id对应对象名字,class对应实现类的具体路径 property对应属性 name 属性的名字 value 设置值 --> <bean id="hello" class="com.duan.pojo.Hello"> <property name="name" value="Spring"/> </bean>
- Spring它是黑箱操作,分析具体步骤:
里面有个beans.xml ----> 管理bean,也就是Java对象 ,java对象全放在beans里面, Spring就像一个容器,存放了许多的对象;一旦你将pojo放进beans里面就变成了一个对象,但是没有使用。
如何将beans.xml文件变成bean对象呢?
1.解析配置文件通过ClassPathXmlApplicationContext类
2.通过反射创建对象并且设置值
- Hello对象的属性是怎么设置值的?
- hello对象的属性是由Spring容器创建的。
IOC创建对象的方式
- 通过有参构造
- 通过下标
- 通过参数名 (推荐)
- 通过参数类型
- 通过无参构造
- 默认会用无参构造
注意点:一定要有一个无参构造方法
代码:
1.创建实体类:
package com.duan.pojo;
public class User {
private String name;
private String sex;
private int age;
public User() {
System.out.println("User的无参构造");
}
public User(String name) {
System.out.println("User的有参构造");
this.name = name;
}
public User(String name, int age) {
System.out.println("User的有参构造2");
this.name = name;
this.age = age;
}
public User(String name, String sex, int age) {
System.out.println("User的有参构造3");
this.name = name;
this.sex = sex;
this.age = age;
}
public void setName(String name) {
System.out.println(name+":"+System.currentTimeMillis());
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", sex=" + sex +'\'' +
", age=" + age +
'}';
}
}
2.Spring配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!--suppress SpringFacetInspection -->
<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">
<!--
Spring的配置文件
bean 代表一个对象
alias 别名
import 导入一个其他资源
-->
<bean id="user" class="com.kuang.pojo.User">
<property name="name" value="duanfu"/>
</bean>
<!--使用构造器的参数下标进行赋值-->
<bean id="user2" class="com.duan.pojo.User">
<constructor-arg index="0" value="duanfu2"/>
<constructor-arg index="1" value="18"/>
</bean>
<!--通过参数名字进行赋值-->
<bean id="user3" class="com.kuang.pojo.User">
<constructor-arg name="name" value="duanfu3"/>
<constructor-arg name="age" value="3"/>
</bean>
<!--通过参数类型进行赋值-->
<bean id="user4" class="com.kuang.pojo.User">
<constructor-arg type="java.lang.String" value="duanfu4"/>
<constructor-arg type="java.lang.Integer" value="18"/>
<constructor-arg type="java.lang.String" value="男"/>
</bean>
</beans>
3.测试类:
package com.duan.pojo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserTest {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = (User)context.getBean("user");
/*
User user = new User();
user.setName("duanfu");
*/
System.out.println(user.toString());
}
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = (User) context.getBean("user4");
System.out.println(user);
}
}