简述
博主从事了一年多的android开发,最近各种机缘巧合转到了java,已经工作了两周,表示工作敲代码照葫芦画瓢没啥问题。但我们不能止于完成工作呀,我们得学后台的框架呀,数据库呀等等,先从spring开始吧,学习路径是第一遍要学会怎么用,然后再去了解spring的工作原理。
Spring简述
在我现在的理解里面他其实最大的功能就是帮我们管理bean对象,我们不需要再去new对象了,需要的时候拿来即可。当然除了管理对象还有一个大的功能就是能帮我们做面向切面编程,去操作数据库的事务,去写日志框架等。现阶段我能用到涉及的核心技术就是Ioc和Aop,其实Aop也不咋用啊。。。
Spring的用法
Sping的创建方式
上面说到spring最大的功能就是帮我们管理对象,那现在我们来看需要怎么操作他才能帮我们管理对象。
先上一个类:Girl(大家都喜欢的类)
public class Girl {
private Integer age;
private Car car;
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Long getHeight() {
return height;
}
public void setHeight(Long height) {
this.height = height;
}
}
public class Car {
public Car(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
那这个类我们配置到spring里面去呢?首先我们需要知道的是spring会有一个配置文件,虽然名字以及位置是不限制的,但是一般情况下我们放在resource下面,然后命名为applicationContext.xml。用idea创建一个spring config的文件默认就是这样:
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
我们现在如果想让spring帮我们管理对象,就需要把bean配置到beans里面去,这里我们有三种方式可以配置。
- 构造方法创建对象
- 静态工厂创建对象
实例工厂创建对象
分别来看一下如何配置:<!--构造方法创建对象--> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean class="org.thingkingWalker.spring.bean.User" id="user" scope="prototype" init-method="init" destroy-method="destroy"/>
解释下:默认就是构造方法创建对象,只需要有class和name就可以了,class是全类名,name是自己指定的名字。 然后其他的比如scope是其他的配置,常用的有两种,singleTon(单例 默认的)和prototype(多例),区别就是创建对象的时候一个是只有一个对象,一个是有很多个对象。然后init-method和destroy-method指的分别是在spring初始化后就会加载的方法和当spring销毁所有对象后会执行的方法。主要是做一些提前或者善后工作。其实这两个就是aop做的事情,原理等我学完怎么用了就去研究。
静态和实例工厂
public class UserFactory {
public static User createUser(){
System.out.println("静态工厂");
return new User();
}
public User createUser2(){
System.out.println("实例工厂");
return new User();
}
}
<!--静态工厂创建对象-->
<bean class="org.thingkingWalker.spring.bean.UserFactory" name="user2" factory-method="createUser"/>
<!--实例工厂创建对象-->
<bean class="org.thingkingWalker.spring.bean.UserFactory" id="user3" factory-method="createUser2" factory-bean="userFactory"/>
<bean class="org.thingkingWalker.spring.bean.UserFactory" id="userFactory"/>
静态工厂只是多了一个factory-method属性,指定创建对象的方法就行了。
实例工厂就需要首先把工厂对象注入到bean里面,然后比静态工厂多一个factory-bean的属性就ok了。
加载spring的方式
//创建容器对象 创建完以后会把spring里面所有的对象都初始化 但以前的BeanFactory(早年用的)只会在使用对象的时候才会创建对象
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//从相对路径下加载
//向容器要girl对象
Girl user = (Girl) ac.getBean("girl");
第一句代码是spring加载配置文件,其实applicationcontext在加载的时候已经把配置文件里所有的bean对象都生成了,就算我们不去去girl对象,他也已经有值了。
对象的属性注入
对于对象他的属性怎么赋值呢?这里是4种方式,常见的是两种
- set方法注入
- 构造函数注入
- p命名空间注入
spel注入
<!--set方法注入--> <bean class="org.thingkingWalker.spring.bean.Girl" name="girl"> <property name="age" value="18"/> <property name="car" ref="car"/> </bean> <bean class="org.thingkingWalker.spring.bean.Car" name="car"> <property name="name" value="benz"/> </bean> <!--构造函数注入--> <bean name="car" class="org.thingkingWalker.spring.bean.Car"> <constructor-arg name="name" value="BMW"/> </bean> <!--0表示参数在构造函数的位置 type表示参数对应的类型--> <bean name="Girl" class="org.thingkingWalker.spring.bean.Girl"> <constructor-arg name="car" ref="car" index="0" type="org.thingkingWalker.spring.bean.Car"/> </bean> <!--p名称空间注入--> <bean name="girl" class="org.thingkingWalker.spring.bean.Girl" p:age="28" p:height="181" p:car-ref="car"/> <!--spel注入 spring expression Language --> <bean name="girl2" class="org.thingkingWalker.spring.bean.Girl" > <property name="age" value="#{girl.age}"/> <property name="car" ref="car"/>
可以看到基本类型直接用value就可以赋值了,但如果是对象属性,用ref这个字段就ok。
复杂对象的赋值
复杂对象指的是集合、数组、配置等类型的数据。
public class ComplexBean {
private Object[] object;
private List list;
private Map map;
private Properties properties;
public Object[] getObject() {
return object;
}
public void setArr(Object[] object) {
this.object= object;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
上面一个五种数据类型我们分别看一下,有一点原则是,其实也可以按照我们上面的方式写,就是当他的数量是1的时候其实就是一个普通的数据类型。
<!--array注入-->
<bean name="arr" class="org.thingkingWalker.spring.bean.CollectionBean">
<!--如果数组中只有一个值,直接使用value即可-->
<!--<property name="arr" value="first"/> -->
<property name="arr">
<array>
<value>1</value>
<value>2</value>
<value>3</value>
<ref bean="girl2"/>
</array>
</property>
</bean>
<!--list注入-->
<bean name="list" class="org.thingkingWalker.spring.bean.CollectionBean">
<!--如果数组中只有一个值,直接使用value即可-->
<!--<property name="arr" value="first"/> -->
<property name="list">
<list>
<value>q</value>
<value>w</value>
<value>d</value>
<ref bean="girl"/>
</list>
</property>
</bean>
<!--map注入-->
<bean name="map" class="org.thingkingWalker.spring.bean.CollectionBean">
<!--如果数组中只有一个值,直接使用value即可-->
<!--<property name="arr" value="first"/> -->
<property name="map">
<map>
<entry key="123" value="23423423"/>
<entry key="432423" value="gfad"/>
</map>
</property>
</bean>
<!--map注入-->
<bean name="prop" class="org.thingkingWalker.spring.bean.CollectionBean">
<!--如果数组中只有一个值,直接使用value即可-->
<!--<property name="arr" value="first"/> -->
<property name="properties">
<props>
<prop key="123">faadfda</prop>
<prop key="432423">1gvfad</prop>
</props>
</property>
</bean>
学习资料有参考黑马的培训视频,初学者我觉得视频还是一个不错的学习资料。不急不躁,每天都在积累进步,这个很不得了,大家一起共勉!!!