Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。
使用Spring框架必须要使用jar包
可以在jar官网下载https://repo.spring.io/libs-release-local/org/springframework/spring/
下载对应的jar包 4.3.10.RELEASE/
版本号说明:
例如版本号:3.1.2RELEASE
3:主版本号。当功能模块有较大更新或者整体架构发生变化时,主版本号会更新
1:次版本号。次版本表示只是局部的一些变动。
2:修改版本号。一般是 bug 的修复或者是小的变动
RELEASE:希腊字母版本号。次版本号用户标注当前版本的软件处于哪个开发阶段
Spring的使用XML配置方式以及Spring的使用
首先创建java项目
/**
* 非IOC方法获取user对象
*/
@Test
public void test1() {
User user=new User();
System.out.println(user);
}
xml配置
<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">
会取得上述连接
在applictionContext.xml中添加如下代码
<!-- 注册User对象-->
<bean class="com.sxt.pojo.User" name="username1" id="userid"/>
效果图:
创建User类
public User(){
System.out.println("访问了无参构造");
}
public void run(){
System.out.println("执行了User类的run方法");
}
创建iocTest类
/**
* 非IOC方法获取user对象
*/
@Test
public void test1() {
User user=new User();
System.out.println(user);
}
测试类test1
在iocTest中创建test2方法利用id查询
/**
* 使用IOC方法获得user对象
* 无参构造必须有否则会报错
* 通过id查询获取user对象
*/
@Test
public void test2(){
//加载Spring容器
ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
//从Spring中获得user对象
User user=(User)ac.getBean("userid");
user.run();
}
执行测试test2方法
注意:无参构造方法必须有否则会报错
通过name访问user
/**
* 通过name获取user
*/
@Test
public void test3(){
//加载Spring容器
ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
//从Spring中获得user对象
User user=(User) ac.getBean("username1");
user.run();
}
测试test3:
测试多个name属性
在name中添加及格name属性
<bean class="com.sxt.pojo.User" name="username1,username2,userneme3"
id="userid"/>
创建test4:
/**
* 多个name属性测试一
*/
@Test
public void test4(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
User user=(User) ac.getBean("username1");
user.run();
}
测试test4方法
创建test5
/**
* 多个name属性测试二
*/
@Test
public void test5(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
User user=(User) ac.getBean("username2");
user.run();
}
测试test5类:
上述两个类都可以通过测试证明name可以有多个:
下面开测试id值是否可以有多个
单个id在上面已经测试过了这里就直接测试多个id:
在applictionContext.xml中添加id属性
这里我创建了多个User对象我就直接复制了:
<bean class="com.sxt.pojo.User" name="username3,username4"
id="userid1,userid2"/>
创建test7方法
/**
* 多个id测试一
*/
@Test
public void test7(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
User user =(User) ac.getBean("userid1");
user.run();
}
测试test7方法:
上述方法执行了无参构造没有执行run方法说明id值只能是唯一的,不能同时存在多个
在将值谢完整后就能后测试成功:
/**
* 多个id测试二
*/
@Test
public void test7(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
User user =(User) ac.getBean("userid1,userid2");
user.run();
}
测试test7方法:
可以执行run方法id值,综上得出id值只能够有一个,而name可以有多个;
测试工厂模式(静态,动态工厂)
创建UserFactory类:
/**
*动态工厂
* 工厂方法,new一个User
* @return
*/
public User getInstance(){
return new User();
}
在applictionContext.xml中配置动态工厂
注意:前面配置的要 注释 或 删除 掉否则会报错
<!-- 动态工厂 -->
<bean class="com.sxt.factory.UserFactory" id="userFactory"/>
<bean factory-bean="userFactory" factory-method="getInstance" id="userid"/>
我这里直接用了test2作为实现方法:
@Test
public void test2(){
//加载Spring容器
ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
//从Spring中获得user对象
User user=(User)ac.getBean("userid");
user.run();
}
测试test2:
可以执行run方法证明动态工厂配置成功
上面遗漏了一个方法没有没有解决就是同时出现注册两个user对象时怎么解决
将applictionContext.xml添加一条注册user
如下图
<!-- 注册User对象-->
<bean class="com.sxt.pojo.User" name="username1,username2,userneme3" id="userid"/>
<bean class="com.sxt.pojo.User" name="username3,username4" id="userid1"/>
测试test6类
@Test
public void test6(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
User user =(User) ac.getBean("userid1");
user.run();
}
会出现如下结果:
只访问了无参构造没有执行run方法:
我们可以在id值userid后加上 User(类名).class可以解决
如下图:
@Test
public void test6(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
User user =(User) ac.getBean("userid1",User.class);
user.run();
}
测试test类
访问到了id为:userid1的的run方法成功,出现这个问题是回因为id值没有被找到,指明要找的id值就可以了。