框架(半成品软件)
高度抽取可重用代码的一种设计,高度的通用性;
框架:抽取成一种高度可重用的;事务控制,强大的servlet,项目中的一些工具。
框架:多个可重用模块的集合,形成一个某个领域的整体解决方案;
常见的框架
SSH(老三大框架)
Struts2
Spring
Hibernate
SSM(新三大框架)
SpringMVC(WEB)
Spring(Service)
Mybatis(Dao)
Spring 框架
Spring是一个service层的框架,可以整合其他框架
容器(可以管理所有的组件(类))框架;
核心关注:IOC和AOP
IOC:- 控制反转
AOP:- 面向切面编程
案例一
第一步:先导入jar包
第二步:配置Spring容器约束文件
<?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="person01" class="cn.tedu.domain.Person01"></bean>
<bean id="person02" class="cn.tedu.domain.Person01"></bean>
</beans>
案例一
/* spring 容器底层默认通过读取配置文件的类的全路径名,通过反射来创建对象
* 并保存到Spring容器的Map内存中并且通过键值对的形式储存,降低了程序的耦合性
* 通过getbean方法容器中找到匹配的键值对,来创建实例,多次获取同一个id的实例是同一个实例*/
public class Test01 {
@Test
public void test01(){
//初始化容器,ApplicationContext是接口创建实现类对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext");
//获取bean,获得对象
Person01 p = (Person01) context.getBean("person01");
//调用p的方法
p.eat();
p.sleep();
System.out.println(p);
//关闭容器
((ClassPathXmlApplicationContext) context).close();
}
//如果配置文件中包含两个id则会抛出异常 BeanDefinitionParsingException,
// 这是因为Spring容器在存储对象时默认以键值对的形式存储的不能出现相同的key值
@Test
public void test02(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person01 p = (Person01) context.getBean("person01");
System.out.println(p);
}
/*
* Spring容器中可以包含相同的class属性,对应不同的id,且获取的是不同的实例*/
@Test
public void test03(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person01 p1 = (Person01) context.getBean("person01");
Person01 p2 = (Person01) context.getBean("person02");
System.out.println(p1);//cn.tedu.domain.Person01@6e0e048a
System.out.println(p2);//cn.tedu.domain.Person01@5bc79255
//关闭资源
((ClassPathXmlApplicationContext) context).close();
}
}
案例二:创建bean的方式
//创建bean
/*
* Spring中默认是调用类的无参构造构造,通过反射来创建bean的
* 如果没有无参构造构造就不能直接配置类的全路径名获得bean*/
//Spring创建bean,没有无参构造构造,默认创建失败
public class Test04 {
//java.lang.NoSuchMethodException:没有默认的无参构造
@Test
public void test01(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person01 p = (Person01) context.getBean("person01");
System.out.println(p);
}
//通过反射创建对象
//java.lang.InstantiationException: cn.tedu.domain.Person01
//直接用clz.newstance,默认调用无参构造但只有含参数构造会抛出异常
// Caused by: java.lang.NoSuchMethodException: cn.tedu.domain.Person01.<init>()
@Test
public void test02() throws Exception {
Class<?> clz = Class.forName("cn.tedu.domain.Person01");
Constructor<?> constructor = clz.getConstructor(String.class);
Person01 p = (Person01) constructor.newInstance("reason");
System.out.println(p);//cn.tedu.domain.Person01@1edf1c96
}
//普通方法创建对象
@Test
public void test03(){
Person01 person01 = new Person01("xx");
System.out.println(person01);
}
}
案例三:利用工厂获取bean
1. 静态工厂
<?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="person01" class="cn.tedu.factory.Person01StaticFactory" factory-method="getInstance"></bean>
</beans>
//创建静态工厂
public class Person01StaticFactory {
//私有化构造方法,不让外界随意的创建对象
private Person01StaticFactory(){
}
//对外界提供公共的静态的getInstance的方法
public static Person01 getInstance(){
return new Person01("reason");
}
}
//测试静态工厂
@Test
public void test05(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person01 person01 = (Person01) context.getBean("person01");
System.out.println(person01);//cn.tedu.domain.Person01@3b084709
}
2. 实例工厂
<?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="person01InstanceFactory" class="cn.tedu.factory.Person01InstanceFactory" ></bean>
<bean id="person01" factory-bean="person01InstanceFactory" factory-method="getInstance"></bean>
</beans>
//创建实例工厂
public class Person01InstanceFactory {
public Person01 getInstance(){
return new Person01("xx");
}
}
//测试实例工厂
@Test
public void test06(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext1.xml");
Person01 person01 = (Person01) context.getBean("person01");
System.out.println(person01);//cn.tedu.domain.Person01@3b084709
}
3. Spring工厂
<?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">
<!--配置Spring工厂-->
<bean id="person01" class="cn.tedu.factory.Person01SpringFactory"></bean>
</beans>
//创建SpringFactory需要实现FactoryBean接口指定泛型为获取实例的泛型
public class Person01SpringFactory implements FactoryBean<Person01> {
@Override
public Person01 getObject() throws Exception {
//返回person01实例
return new Person01("xx");
}
@Override
public Class<?> getObjectType() {
//返回实例的class对象
return Person01.class;
}
@Override
public boolean isSingleton() {
//是否是单例,Spring默认全局只有一个实例
return true;
}
}
//测试Spring工厂
@Test
public void test07(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext2.xml");
Person01 person01 = (Person01) context.getBean("person01");
System.out.println(person01);//cn.tedu.domain.Person01@23e028a9
}