一.简介
二.加载和启动
文件和资源配置
列表内容发个大概豆腐干豆腐干豆腐干梵蒂冈梵蒂冈豆腐干豆腐干豆腐干豆腐干的
类和原理
说到底发个大概豆腐干豆腐干豆腐干梵蒂冈梵蒂冈豆腐干豆腐干豆腐干豆腐干的
三.配置文件配置
IOC,原理
IOC的本意是控制反转,所谓控制反转,通俗来说就是程序本身并不承担创建具体类实例的任务,而将这个任务交给一个独立的容器,在程序启动时同时启动容器,由这个容器创建好每个程序需要的类实例并通过下面要提到的DI(依赖注入)装配好,由程序直接调用(从容器中获取)。
独立的容器可以通过配置文件或注解的方式决定创建什么样的类实例以及怎样装配,是否加事务等切面,是否加代理等。这样可以轻易实现可配置。
在程序中体现为每一层架构所需的实例可配置,层与层之间所引用的实例可配置,结合面向接口的程序设计思想,只需要改动接口内容(不需要改名字,引用方式),指定和改动接口实现类,以及通过容器重新配置,就可实现所有层级功能类可配置和架构层面的层与层间完全解耦,便于业务变更和扩展,免于大量改动,部署甚至重新开发。
原理:Java反射机制,通过ClassLoader加载类名获取Class对象,反射Class对象,得到其构造函数创建类实例对象,得到其setter方法设置属性。
反射简例:
//1.获取当前线程的ClassLoader
ClassLoader loader = Thread.currentThread().getContextClassLoader();
//2.通过ClassLoader加载类名(通过配置文件解析获取的)获取Class对象
Class clazz = loader.loadClass("com.baobaotao.reflect.Car");
//3.通过Class对象获取构造方法,创建类实例
Constructor cons = clazz.getDeclaredConstructor((Class[])null);
Car car = (Car)cons.newInstance();
//4.通过Class对象获取特定的setter方法,在创建好的类实例上执行,设置类实例的属性值
Method setBrand = clazz.getMethod("setBrand",String.class);
setBrand.invoke(car,"红旗CA72");
IOC配置简例:
<bean id="car" class="com.baobaotao.simple.Car"/>
- DI,几种配置方式
1)配置文件,属性注入
属性注入要求bean提供一个默认构造函数(无参,特别是手动写了其他有参构造函数的情况下,java默认构造函数被替换,需要手动再写一个无参构造函数,用于Spring反射Class对象默认构造函数创建类实例),并为需要注入的属性提供对应的setter方法。
简例(引用其他bean):
//bean定义
public class Boss {
private Car car;
//不要忘记setter方法,和普通属性注入原理一样,区别于注解注入
public void setCar(Car car) {
this.car = car;
}
}
//bean配置:
<bean id="car" class="com.baobaotao.attr.Car"/>
<bean id="boss" class="com.baobaotao.attr.Boss">
<property name="car">
<ref bean="car"/>
</property>
</bean>
//属性bean即Car实例也可在boss配置property内部配置成一个匿名bean:
<bean id="boss" class="com.baobaotao.attr.Boss">
<property name="car">
<bean class="com.baobaotao.attr.Car">
</bean>
</property>
</bean>
//集合类型属性举例:
//List(Set与List配置方式相同):
//bean定义
public class Boss {
private List favorites = new ArrayList();//初始化
//getter,setter
public List getFavorites() {
return favorites;
}
public void setFavorites(List favorites) {
this.favorites = favorites;
}
}
//bean配置:
<bean id="boss1" class="com.baobaotao.attr.Boss">
<property name="favorites">
<list>
<value>看报</value>
<value>赛车</value>
<value>高尔夫</value>
</list>
</property>
</bean>
//Map(泛型和非泛型配置相同,其他集合同):
//bean定义
public class Boss {
private Map<String,Integer> jobTime= new HashMap<String,Integer>();//初始化
//getter,setter
public Map<String,Integer> getJobTime() {
return jobTime;
}
public void setJobTime(Map<String,Integer> jobTime) {
this.jobTime= jobTime;
}
}
//bean配置(一个entry标签对应一个键值对):
<bean id="boss1" class="com.baobaotao.attr.Boss">
<property name="jobTime">
<map>
<entry>
<key><value>会见时间</value></key>
<value>124</value>
</entry>
<entry>
<key><value>会见地点</value></key>
<value>256</value>
</entry>
</map>
</property>
</bean>
//Properties:
//bean定义
public class Boss {
private Properties mails= new Properties();//初始化
//getter,setter
public Properties getMails() {
return mails;
}
public void setMails(Properties mails) {
this.mails = mails;
}
}
//bean配置:
<bean id="boss1" class="com.baobaotao.attr.Boss">
<property name="mails">
<props>
<prop key="jobMail">john-office@baobaotao.com</prop>
<prop key="lifeMail">john-life@baobaotao.com</prop>
</props>
</property>
</bean>
//util命名空间方式(先在Spring配置文件头中引入util命名空间声明):
//一个List类型的bean(Set类型的与此配置相同,改为util:set标签):
<util:list id="favoritesList1" list-class="java.util.LinkedList">
<value>看报</value>
<value>赛车</value>
<value>高尔夫</value>
</util:list>
//一个Map类型的bean:
<util:map id="emails1" map-class="java.util.LinkedHashMap">
<entry key="AM" value="会见客户"/>
<entry key="PM" value="公司内部会议"/>
</util:map>
//p命名空间方式简化配置(先在Spring配置文件头中引入p命名空间声明):
//bean配置(内容中属于XML特殊字符的需要使用转义替换,在非简写形式中也可使用<![CDATA[]]>处理):
<bean id="car" class="com.baobaotao.ditype.Car"
p:brand="红旗&CA72"
p:maxSpeed="200"
p:price="20000.00"/>
//引用对象:
<bean id="boss" class="com.baobaotao.ditype.Boss"
p:car-ref="car"/>
//继承关系配置
//声明为abstract="true",表示这个bean配置不实例化为一个对应bean对象,是一个继承思想中消除重复配置的抽象类,子类中声明其为父类:
<bean id="abstractCar" class="com.baobaotao.tagdepend.Car"
p:brand="红旗CA72" p:price="2000.00" p:color="黑色" abstract="true"/>
<bean id="car3" p:color="红色" parent="abstractCar"/>
<bean id="car3" p:color="白色" parent="abstractCar"/>
2)配置文件,构造函数配置
使用构造函数注入的前提是必须提供带参构造函数,该注入方式保证一些必要属性在bean实例化时即得到设置,保证了bean实例化后就可使用。
简例(最全面和精确的联合使用类型和索引匹配入参的方式):
//bean定义(多个构造函数)
public class Car {
...
public Car(String brand,String corp,double price) {
this.brand = brand;
this.corp = corp;
this.price = price;
}
public Car(String brand,String corp,int maxSpeed) {
this.brand = brand;
this.corp = corp;
this.maxSpeed = maxSpeed;
}
}
//bean配置(对应Car(String brand,String corp,int maxSpeed)构造函数):
<bean id="car3" class="com.baobaotao.ditype.Car">
<constructor-arg index="0" type="java.lang.String">
<value>红旗CA72</value>
</constructor-arg>
<constructor-arg index="1" type="java.lang.String">
<value>中国一汽</value>
</constructor-arg>
<constructor-arg index="2" type="int">
<value>200</value>
</constructor-arg>
</bean>
//通过自身类型反射匹配入参(构造函数入参类型可辩别,即非基础类型且不同构造函数入参类型各异,可通过java反射获取入参类型,Spring可判断出正确构造函数并正确完成构造函数注入)
//bean定义
public class Boss {
...
public Boss(String name,Car car,Office office) {
this.name = name;
this.car = car;
this.office = office;
}
}
//bean配置
<bean id="boss" class="com.baobaotao.ditype.Boss">
<constructor-arg>
<value>John</value>
</constructor-arg>
<constructor-arg>
<ref bean="car"/>
</constructor-arg>
<constructor-arg>
<ref bean="office">
</constructor-arg>
</bean>
<bean id="car" class="com.baobaotao.ditype.Car">
<bean id="office" class="com.baobaotao.ditype.Office">
//循环依赖问题(构造函数注入中两个bean以属性方式互相引用,解决办法是调整为属性注入方式,后者是先创建实例后设置属性,避免构造函数注入方式的循环依赖都无法创建,注意属性注入方式有时需要手动提供默认构造函数)
3)注解配置
4)工厂方法注入(配置文件方式,略)
四.注解配置
五.框架整合应用
SpringMVC
1)启动依赖及原理
2)控制器的几种配置方式
3)数据接收和返回格式配置与转换
4)视图层
MyBatis
- SpringJDBC
- 事务及原理
- 定时任务