浅谈Spring(一)
Spring介绍
Spring认证框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在 2002 年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架 .
概念:
J2EE:java企业级开发
J2SE:java基础语法
J2ME:java移动端开发(已经淘汰),现金最多的是安卓以及ios
bean:由Spring管理的对象就是bean对象
轻量级容器:使用较为简单便捷,在内存中开辟一块空间储存和管理bean对象
**总结:**Spring是一个开源的轻量级的J2EE框架,用来管理bean的生命周期的容器
接下来通过实例看一看Spring如何帮我们创建并管理对象的
在没有学习Spring之前我们是这样写代码的
创建Dog类
public class Dog {
public void say(){
System.out.println("旺旺");
}
}
创建Cat类
public class Cat {
public void say(){
System.out.println("妙妙");
}
}
创建Host类
public class Host {
private static Dog dog = new Dog();
public static void main(String[] args) {
dog.say();
}
}
大家思考一个问题,这段代码有什么不妥之处?
现在主人就养了一直宠物狗,那么以后养一只宠物猫该怎么办?是不是需要再new一个cat对象,在调用方法,这样的代码耦合性太高,后期也不容易维护,以后再养别的宠物就需要一直修改代码
优化:
宠物狗和宠物猫还有以后宠物猪什么的,归根结底都是宠物,我们可以把宠物共同的特性提取出来,写一个接口,这样就解决了上述的问题
创建接口Pet
public interface Pet {
void say();
}
将Dog和Cat实现此接口
public class Dog implements Pet{
public void say(){
System.out.println("旺旺");
}
}
public class Cat implements Pet{
@Override
public void hello() {
System.out.println("猫");
}
}
修改Host类
public class Host {
private static Pet pet = new Cat();
public static void main(String[] args) {
pet.say();
}
}
根据多态的原则,我们只需要new想要的宠物即可,就不用再重新new对象了.这就是面向接口思想,但是还是需要我们创建对象,对象和对象之间还是有耦合性,所以这时候我们就需要一个东西帮助我们创建对象并管理对象了.
Spring-IOC
IOC(Inversion Of Control):即控制反转,意思是将对象的创建管理权交给Spring容器,我们不在关注对象的创建和管理,把这些都交给第三方,Spring容器来做,完全实现了松耦合.
IOC案列
创建Pet接口
public interface Pet {
void say();
}
创建Dog类
public class Dog implements Pet {
@Override
public void say() {
System.out.println("旺旺");
}
}
配置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">
<!--1. IOC的机制管理Dog对象
id: 对象的唯一标识符. 不能重复 见名知意 首字母小写
class: 类路径
-->
<bean id="dog" class="com.qty.demo2.Dog"></bean>
</beans>
bean标签中的重要属性:
id:对象的唯一标识符,不能重复,见名知意,首字母小写
class:类的全路径,意思就是要让这个类被Spring管理
编辑User类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class User {
public static void main(String[] args) {
// 指定配置文件
String resource = "spring.xml";
// 创建容器对象
ApplicationContext context =
new ClassPathXmlApplicationContext(resource);
Dog dog = context.getBean(Dog.class);
dog.say();
}
}
1.指定xml配置文件
2.创建容器对象
3.通过容器对象调用getBean方法创建对象,通过反射机制完成
IOC实现原理
容器的数据结构是K-V,也就是Map结构,K=bean中的id,V=实例化对象
程序执行过程
1.指定xml配置文件
2.Spring容器记载配置文件,扫描bean标签时,开始创建对象
3.首先根据class属性的值,获取类型的路径, 之后通过反射机制创建对象,必须有无参构造
4.bean中的id当作Map中的key,实例化的对象当作是value,Spring启动成功
5.当用户需要对象时,可以通过id/类型获取.
Spring注解开发
上述我们通过xml配置文件的方法,实现了不new对象而让Spring帮我们创建对象的操作,随着java注解的流行,现在Spring注解开发是比较简单快捷的.
创建配置类
配置类:作用和xml配置文件类似,我们需要在配置类中加一些注解
注解:作用就是标识/标记
import com.qty.demo2.Dog;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.qty.demo2")
public class SpringConfig {
@Bean
public Dog dog(){
return new Dog();
}
}
注解说明:
@Configuration:标明这是一个配置类
@ComponentScan(“类路径”):扫描该路径,使注解生效
编辑测试类
public class User {
public static void main(String[] args) {
// // 指定配置文件
// String resource = "spring.xml";
// // 创建容器对象
// ApplicationContext context =
// new ClassPathXmlApplicationContext(resource);
// Dog dog = context.getBean(Dog.class);
// dog.say();
ApplicationContext context =
new AnnotationConfigApplicationContext(SpringConfig.class);
Dog dog = context.getBean(Dog.class);
dog.say();
}
}
通过对比,注解开发比xml配置文件要简单很多.
一些概念
1.单例对象和多例对象
单例对象指,Spring容器只有一份对象,默认是单例的
多例:Spring容器中创建多个对象
需要注解:@Scope(“singleton”)单例/@Scope(“prototype”)