Spring是什么?
- spring核心:IOC(DI)控制反转+AOP面向切面编程
- spring功能: spring中可以使用Java注解以及XML文件对容器内的bean对象进行组合实现复杂功能;spring可以很好的整合其他开源框架以及类库。
- DI:在没有spring以前,我们需要一个类似的bean对象,需要自己主动创建,而现在只需要提出这样的一个需求,springIOC就会通过配置文件为我们注入该……(依赖spring的IOC容器给我们注入)
- spring是为了简化企业级应用而生的开源容器框架,特点:非倾入性、IOC、AOP、容器、一站式框架(在AOP|IOC基础上整合其他框架)
spring的实现
- 导入spring的核心jar包(eclipse开发最好装上spring插件便于开发)并且创建applicationContext.xml.
配置bean(基于xml文件、注解2种形式)
- bean实例的获取方式:通过全类名(反射)、通过工厂方法(静态记忆动态)、通过factorybean
- 通过工厂方法获取bean
- 实例工厂方法(在创建相应的bean之前先创建工厂实例):
public class StaticCarFactory {
private Map<String ,Car> cars=null;
public StaticCarFactory (){
cars=new HashMap<String,Car>();
cars.put("01", new Car());
Car car1=new Car();
car1.setMaxSpeed(10000);
car1.setName("dadawww");
cars.put("02", car1);
}
public Car getCar(String key){
return cars.get(key);
}
}
配置工厂实例
<bean id="staticCarFactory" class="com.wjy.spring.beans.auto.StaticCarFactory">
</bean>
配置bean实例,指定工厂及方法以及念书
<bean id="carx" factory-bean="staticCarFactory" factory-method="getCar">
<constructor-arg value="02"></constructor-arg>
</bean> - 静态工厂方法:为需要创建bean实例的类创建一个静态工厂类,直接通过该工厂类的静态方法就可以返回bean的实例
public class StaticCarFactory {
private static Map<String ,Car> cars=new HashMap<String,Car>();
static{
cars.put("01", new Car());
Car car1=new Car();
car1.setMaxSpeed(10000);
car1.setName("dada");
cars.put("02", car1);
}
public static Car getCar(String key){
return cars.get(key);
}
}
配置额类指向工厂类,并且指定工厂方法,以及相应的参数
<bean id="carx" class="com.wjy.spring.beans.auto.StaticCarFactory" factory-method="getCar">
<constructor-arg value="key"></constructor-arg>
</bean>
- 实例工厂方法(在创建相应的bean之前先创建工厂实例):
- 反射获取bean的相关配置【导入类库、创建好对应的bean类,配置XML文件,即可通过一下方式直接获取bean实例】:
反射方式配置bean:class属性:通过反射创建对象,id属性:我们可以通过id属性来调用该bean
<bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld">
</bean>
获取bean:
1、创建IOC容器
// ApplicationContext applicationContext=new ClassPathXmlApplicationContext(“applicationContext.xml”);
2、从IOC容器获取bean实例
// HelloWorld helloWorld=(HelloWorld) applicationContext.getBean(“helloWorld”);
/*该方法获取bean要求容器中只有一个该类型的bean对象
HelloWorld helloWorld=(HelloWorld) applicationContext.getBean(helloWorld.class);
*/
3、调用bean的方法
// helloWorld.hello();
为bean配置属性:set方法(需要相应的set方法)、构造方法(需要相应的构造方法)
- set方法:name属性标识bean对应的属性名称、value属性进行赋值(若包含特殊字符可以使用
<![CDATA[]]>
包装起来使用)
<bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld">
<!-- 为属性赋值 -->
<property name="name" value="Jerry"></property>
<property name="name">
<value><![CDATA[<shanghai>]]></value>
</property>
</bean>
bean的成员变量为引用类型
<bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld">
<property name="car" ref="car2"></property>
</bean>
<bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld">
<property name="car"><ref bean="car2"/></property>
</bean>
<bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld">
添加一个内部bean(内部bean外面不能引用)
<property name="car">
<bean id="car" class="com.atguigu.spring.helloworld.Car">
<constructor-arg value="KUGA" index="1"></constructor-arg>
<constructor-arg value="ChangAnFord" index="0"></constructor-arg>
<constructor-arg value="250000" type="float"></constructor-arg>
</bean>
</property>
</bean>
为级联属性赋值(属性需要先初始化后再为级联属性赋值,否则有异常)
<bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld">
<property name="car" ref="car2"></property>
<property name="car.name" value="aodi"></property>
</bean>
bean中含有集合属
<bean id="user" class="com.atguigu.spring.helloworld.User">
<property name="userName" value="Jack"></property>
<property name="cars">
<!-- 使用 list 元素来装配集合属性 -->
<list>
<ref bean="car"/>
<ref bean="car2"/>
</list>
</property>
</bean>
<!-- 声明集合类型的 bean -->(需要导入util命名空间)
<util:list id="cars">
<ref bean="car"/>
<ref bean="car2"/>
</util:list>
<bean id="user2" class="com.atguigu.spring.helloworld.User">
<property name="userName" value="Rose"></property>
<!-- 引用外部声明的 list -->
<property name="cars" ref="cars"></property>
</bean>
MAP集合
<bean id="user" class="com.atguigu.spring.helloworld.User">
<property name="userName" value="Jack"></property>
<property name="cars">
<!-- 使用 list 元素来装配集合属性 -->
<map>
<entry key="AA" value-ref="car1"></entry>
<entry key="BB" value-ref="car2"></entry>
</map>
</property>
</bean>
外部map
<util:map id="cars">
<entry key="AA" value-ref="car1"></entry>
<entry key="BB" value-ref="car2"></entry>
</util:map>
配置properties(properties是HashTable【实现了Map接口】的子类)
<bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld">
<property name="properties">
<props>
<prop key="user">root</prop>
<prop key="user">root</prop>
<prop key="user">root</prop>
<prop key="user">root</prop>
</props>
</property>
</bean>
使用p命名空间配置bean的属性(需要先导入P命名空间)
<bean id="helloWorld" class="com.wjy.spring.beans.HelloWorld" p:name="weijiayu" p:cars-ref="cars">
</bean>
Xml文件中的自动装配通过autowire属性实现(通过bean的name【id属性】与相应bean对象的属性名相同 或者type进行自动装配)【自动装配很少使用】
<bean id="address1" class="com.wjy.spring.beans.auto.Address" autowire="byName"></bean>
<bean id="address1" class="com.wjy.spring.beans.auto.Address" autowire="byType"></bean>
- set方法:name属性标识bean对应的属性名称、value属性进行赋值(若包含特殊字符可以使用
bean的作用域(默认情况下在IOC容器的生命周期下只会为同一个bean节点产生一个bean对象)
- 使用bean的scope属性,可以从IOC容器重新创建一个新的bean对象给我们
- singleton:默认值,容器初始时就创建bean,并且只会产生一个bean实例(单例)
- prototype:原型的,在每次请求时会创建一个bean实例(多例)
- 使用bean的scope属性,可以从IOC容器重新创建一个新的bean对象给我们
- 配置IOC容器中bean与bean之间的关系(继承与依赖)
- 依赖(当要求配置一个bean时必须有一个关联的bean,即当前bean依赖于另一个bean)depends-on属性实现,若依赖多个bean可通过,隔开
<bean id="car" p:maxSpeed="1002" parent="car1" depends-on="person">
- 继承(bean中的id属性是不会被继承的,若在子bean配置了相应属性,则会覆盖父bean的配置)
<bean id="car1" class="com.wjy.spring.beans.Car">
<property name="name" value="aodi"></property>
<property name="maxSpeed" value="100"></property>
</bean>
<bean id="car" p:maxSpeed="1002" parent="car1"></bean>
我们可以配置一个模板bean(同时可以通过abstract属性抽象它让它不能产生实例,只作为模板使用)
<bean id="car1" class="com.wjy.spring.beans.Car" abstract="true">
<property name="name" value="aodi"></property>
<property name="maxSpeed" value="100"></property>
</bean>
- 依赖(当要求配置一个bean时必须有一个关联的bean,即当前bean依赖于另一个bean)depends-on属性实现,若依赖多个bean可通过,隔开
- bean的生命周期,类似于servlet,IOC容器可以对bean生命周期进行细致操作
- 通过构造器或者beanFactory创建bean
- 为bean的属性赋值初始化
- 容器关闭shi调用bean的销毁方法
- 在bean中设置init-method,destory-method,可以指定bean的初始化以及销毁方法(需要在bean对应的类中创建以对应属性值为名称的方法)
<bean id="hehe" class="^^^^" init-method="init1" destory-method="destory1">
</bean> - bean的后置处理器可以对bean初始化前后对IOC容器内所有的bean做一定的处理
- 创建一个继承自BeanPostProcess接口的实现类,并在配置文件中配置该实现类对应额bean(postProcessAfterInitialization需要将其获得额bean参数返回,当然你也可以自己创建一个对象进行返回来个偷梁换柱)
<bean class="com.wjy.spring.beans.auto.MyBeanPostProcess">
</bean>
- 创建一个继承自BeanPostProcess接口的实现类,并在配置文件中配置该实现类对应额bean(postProcessAfterInitialization需要将其获得额bean参数返回,当然你也可以自己创建一个对象进行返回来个偷梁换柱)
基于注解额方式配置bean
- spring能够从classpath路径下自动扫描带有特定注解的组件【@component标识了一个受spring管理的组件\@respsitory标识持久层组件\@controller标识表现层组件\@service标识业务层组件】对于扫描到到的组件,spring采用默认的命名策略,也可以通过注解的value属性值来进行标识
- 添加完注解还需要在配置文件中进行一定配置(需要在文件头导入context命名空间)
<context:component-scan base-package="com.atguigu.spring.annotation.hehe"></context:component-scan>
- context:component-scan元素会自动注册autowiredAnnotationBeanPostProcessor后置处理器实例,该实例可以通过【@autowired\@resource\@inject】注解自动装配当前bean所依赖的bean(在配置文件中已经配置了该类型的bean,或者注解为@autowired(required=”false”),若容器内包含多个该类型的bean,spring会根据自己的规则去选择和(需要实例)属性名称一致的id的bean,若不存在则显示不是唯一的bean,则需要指定@qualifier(“beanID”))
- 使用注解配置bean、使用注解配置bean的属性
- spring的泛型依赖注入
- spring可以使用注解完全取代XML配置文件
IOC容器:beanFactory、applicationContext
1、创建Spring的IOC容器对象(在创建容器时默认情况下spring会调用构造器对在配置文件中配置的bean进行创建初始化并且调用set方法对配置的属性进行赋值,但若修改bean的scope属性,容器则会新建一个bean对象给我们而不是在容器创建时就初始化bean)
2、spring提供了2种实现IOC容器的方式,一种是通过applicationContext接口(面向用户),另一种则是通过beanFactory实现(该实现面向spring框架本身)
3、configurableApplicationContext接口则实现了对applicationContext的扩展,可以对bean的生命周期进行控制
4、webapplicationContext则是专门为web应用扩展的接口
使用外部文件 ##
- 在配置文件中bean时,有时需要将系统部署相关信息也配置到引入到该文件中,这时如果直接将信息配置到文件中可能会对后续维护上不利影响,这时就可以通过beanFactory后置处理器将部分配置信息外移到属性文件当中,而在 bean中可以通过类似EL的方式${var}来访问这些信息。
导入外部文件
<context:property-placeholder location="文件地址">
<bean id="dataSource" class="^^^^^^^^^^^^^">
<!--使用外部文件属性-->
<property name="user" value="${user}"></property>
<property name="user" value="${user}"></property>
</bean>
pinke中导入外部文件的案例
<!-- 指定数据库配置信息 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:c3p0.properties</value>
<value>classpath:jdbc.properties</value>
<value>classpath:conf.properties</value>
</list>
</property>
</bean>
AOP与动态代理
- 切面:aspect,横切关注点(跨越应用程序多个模块的)被特殊模块化的对象
- 通知:advice,切面需要完成额工作
- 目标:target,被通知的对象
- 代理:proxy。想目标对象通知之后创建的对象
- 链接点:jionpoint,程序执行的某个特定位置
总结spring
理清楚,JDBC,数据源,mybaties之间的关系