Spring概述
spring是一个开源的框架
IoC(控制反转)
Spring是一个分层的JavaSE/EE一站式轻量级的Java开源框架。
Spring为了解决企业应用开发的复杂性而创建的。
框架的主要优势之一就是其分层架构
,分层框架允许使用者选择使用哪个组件,同时为J2EE应用程序开发提供集成的框架。
###########################################################
Spring使用基本的JavaBean来完成以前可能由EJB完成的事情。
Spring的核心是控制反转(loC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架。
spring是一站式的轻量级开源框架的原因?
EE开发可分为三层架构:
针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术。
***web层:***:SpringMVC
service层:Spring的loC,例如Spring的Bean管理、Spring声明式事务
dao层:Spring的JDBCTemplate(Spring的JDBC模板)
Spring的ORM模板(用于整合其他持久层框架,比如Hibernate)
Spring的核心部分(两个部分)
IoC(控制反转)
IoC:控制反转。比如:一个类A中,需要用到另一个类B的方法,那么我们就要在A中实力化B,然后调用B的方法,代码:
Class A{
private Class b = new ClassB();
b.method();
}
如果由C、D类,当他们都需要用到B的方法的时候,同样也需要实例化B,然后再调用B中的方法。如果B的实例化是一个非常消耗系统资源的过程,比如数据库连接等,那么每次一个类中需要调用B的方法,就要实例化B一次,这将是一个非常消耗系统资源的过程。
在Spring框架中对以上进行实现:
我们每次使用Spring框架是要配置xml文件,xml文件配置bean的·id合class,spring中默认的bean为单实例模式,而且通过bean的class,通过反射机制可以创建这个实例,因此spring的框架通过反射替我们创建好了实例并且替我们维护他们,A需要引用B类,在xml通过构造器或者属性把B注入到A中,其实就是spring框架,把B实例的引用传给了A的成员变量。
Spring实现控制反转的三种方式
Spring IoC的属性注入(set注入)方法,
代码:
package com.zhizhi;
import sun.jvm.hotspot.runtime.ArgumentSizeComputer;
public class Student {
private String name;
private String sex;
//在这里定义要依赖的teacher属性,加上set方法
private Teacher teacher;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
teacher类
package com.zhizhi;
public class Teacher {
private String name;
private String clazz;
//自定义的方法
public void xinSheng(){
System.out.println("招到了一个新的学生");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
}
从上面代码可以显示出:Student类有三个属性:name、sex、teacher,并且都有对应的getter、setter方法,Teacher类里面有两个属性。分别是姓名,班级,也有对应的geeter、setter方法,
即第一步:在类里面声明属性并且实现set方法。
第二步:编写一个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">
<bean id="student" class="com.zhizhi.Student">
<property name="name" value="郭郭"></property>
<property name="sex" value="男"></property>
<property name="teacher" ref="teacher"></property>
</bean>
<bean id="teacher" class="com.zhizhi.Teacher">
<property name="name" value="智智"></property>
<property name="clazz" value="二班"></property>
</bean>
</beans>
在上面的xml文件中:
1、声明一个bean,可以理解为去实例化了一个对象,上面代码中实例化了两个对象,分别是student和teacher,各个属性都已经赋值上去了。
2、id为student的bean。其实就是Student类,通过propetry赋值,Spring就会通过Student类的各个属性的set方法,逐一给Student类的·属性赋值。
3、在student类里面,有一个属性是teacher,可以看到他属性值是ref=“teacher”,这就说明teacher这个属性是一个引用,这里ref后面的值其实就是指向另一个bean的id值,所以这里引用的是id为teacher的bean。
方式二:构造器注入
构造器注入,就是在构造器里面注入依赖对象。其实就跟属性注入差不多,定义一个有参构造器,然后配置xml文件就行了。
package com.zhizhi;
public class Programmer {
private Computer computer;
public Programmer(Computer computer) {
this.computer = computer;
}
}
package com.zhizhi;
public class Computer {
private String color;
private String brand;
private String size;
public Computer(String color, String brand, String size) {
this.color = color;
this.brand = brand;
this.size = size;
}
}
<?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 id="student" class="com.zhizhi.Student">
<property name="name" value="郭郭"></property>
<property name="sex" value="男"></property>
<property name="teacher" ref="teacher"></property>
</bean>
<bean id="teacher" class="com.zhizhi.Teacher">
<property name="name" value="智智"></property>
<property name="clazz" value="二班"></property>
</bean>
<bean id="programmer" class="com.zhizhi.Programmer">
<constructor-arg ref="computer"></constructor-arg>
</bean>
<bean id="computer" class="com.zhizhi.Computer">
<constructor-arg value="联想"></constructor-arg>
<constructor-arg value="红色"></constructor-arg>
<constructor-arg value="15.6英寸"></constructor-arg>
</bean>
</beans>
如何选择注入·:
一般来说,有强依赖关系的就用构造器注入,其他是可选属性的就用属性注入,不过,现在大部分都是用自动装配。
方式三:自动装配方式
package com.zhizhi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Pop {
@Autowired
Com com;
}
package com.zhizhi;
import org.springframework.stereotype.Component;
@Component
public class Com {
private String brand;
private String color;
private String size;
}
<?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/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<context:component-scan base-pakage="com.zhizhi"/>
</beans>
关键点:在类前面加注解,@Component,在需要注入的类里面加注解:@Autowired,这样xml里面的自动扫描就会扫描到这些加了注解的类和属性,在实例化bean的时候,Spring容器会把加了@Component的类实例化,在实际运行时,会给加了@Autowired的属性注入对应的实例。