什么是spring?
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用 。
spring容器架构图
什么是控制反转(IOC)或依赖注入(DI)
控制反转:当我们调用一个方法或者类时,不再由我们自己创建类的对象,而是把控制权交给别人.
依赖注入:spring主动创建被调用类的对象,然后把这个对象注入到我们自己的类中,使得我们可以使用它。
总体来说将以前由程序员实例化对象/赋值的工作交给了spring处理
下面我们用简单的利用梳理对比spring的方便与快捷
创建一个UserBiz接口
public interface UserBiz {
//上传文件
public void upload();
}
创建UserBizImplOne类
public class UserBizImplOne implements UserBiz {
@Override
public void upload() {
// System.out.println("实现图片上传的功能");
// System.out.println("利用缓存流/缓存区实现上传图片");
System.out.println("实现图片上传的功能");
}
}
创建UserBizImplTwo类
public class UserBizImplTwo implements UserBiz {
@Override
public void upload() {
System.out.println("利用缓存流/缓存区实现上传图片");
}
}
创建UserAction类直接调用
public class UserAction {
//private UserBiz userBiz = new UserBizImplOne();
private UserBiz userBiz = new UserBizImplTwo();
public void upload(){
this.userBiz.upload();
}
}
创建text类
public class IocTest {
@SuppressWarnings("resource")
public static void main(String[] args) {
//
UserAction userAction = new UserAction();
userAction.upload();
}
}
通过IOC方式来调用实现类的方法
创建UserBiz接口
/**
* IOC 特性 反转控制
* @author Administrator
*
*/
public interface UserBiz {
//实现图片上传
public void upload();
}
通过IOC调用
public class UserAction {
private UserBiz userBiz;
public UserBiz getUserBiz() {
return userBiz;
}
public void setUserBiz(UserBiz userBiz) {
this.userBiz = userBiz;
}
public void upload() {
this.userBiz.upload();
}
}
创建springbeans
<!--IOC特性 -->
<!--bean Class是指javaBean的全限定类名 name 在spring上文中的唯一标识 -->
<bean class="com.zking.services.biz.UserBizImplOne" name="userBizOne"></bean>
<bean class="com.zking.services.biz.UserBizImplTwo" name="userBizTwo"></bean>
<bean class="com.zking.services.web.UserAction" name="userAction">
<!-- property name是指javaBen的变量 ref 哪个类注入到IOC容器中 -->
<property name="userBiz" ref="userBizOne"></property>
</bean>
创建Test类
public class IocTest {
@SuppressWarnings("resource")
public static void main(String[] args) {
//获取spring上下文(建模)
System.out.println("=================IOC特性");
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-context.xml");
UserAction userAction = (UserAction) applicationContext.getBean("userAction");
userAction.upload();
}
}
IOC注入的两种方式
set注入和构造器注入
set注入
创建StudentAction类
public class StudentAction {
private int sid;
private String sname;
private List<String> hobbies;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public List<String> getHobbies() {
return hobbies;
}
public void setHobbies(List<String> hobbies) {
this.hobbies = hobbies;
}
public void run() {
System.out.println(this.sid+"--"+this.sname+"---"+this.hobbies);
}
}
创建springbeans
<!--IOC注入方式 八大基本数据类型+String+3
java.util.Date
java.sql.Date java.sql.Time
java.sql.Timestamp
通过<value></value>赋值即可 -->
<bean class="com.zking.services.web.StudentAction" name="stuAction">
<!--set注入 -->
<property name="sid" value="1001"></property>
<property name="sname" value="张三"></property>
<property name="hobbies">
<list>
<value>篮球</value>
<value>足球</value>
<value>羽毛球</value>
</list>
</property>
</bean>
创建test类
//注入方式 set方式 构造器
System.out.println("================IOC注入方式");
// Invalid property 'sid' of bean class [com.zking.services.web.StudentAction]: Bean property 'sid' is not writable or has an invalid setter method.
//Does the parameter type of the setter match the return type of the getter?
//当属性值没有提供setter 和 getter方法时 会报错
//解决方法 : 提供setter and getter方法
StudentAction studentAction = (StudentAction) applicationContext.getBean("stuAction");
studentAction.run();
构造器注入:同理 把上面StudentAction类的setter和getter方式去除,提供有参数和无参数构造器
创建springbeans
<bean class="com.zking.services.web.StudentAction" name="stuAction">
<!-- 构造器注入 -->
<constructor-arg name="sid" value="1002"></constructor-arg>
<constructor-arg name="sname" value="李四"></constructor-arg>
<property name="hobbies">
<list>
<value>篮球</value>
<value>足球</value>
<value>羽毛球</value>
</list>
</property>
</bean>
测试类如同上set注入的测试列即可’