版权声明:本文为博主原创文章,未经博主允许不得转载。 转载联系邮箱:[email protected]
Copyright © 2018 DAR林克斯 保留所有权利
一、Spring简介:
Spring是一个容器类的框架,Spring体系中拥有Java EE开发的所有需要的模块,但是它也不排斥其它的框架,可以很好地组织和管理其它地框架,使之形成一个统一地整体。
1.IOC:Inversion of Control控制反转,以前我们资源地控制权在Java程序中,而使用spring以后,资源控制权交给spring地IOC容器(applicationContext.xml)。
2.DI:Dependency Injection(依赖注入),资源由原来在Java程序中通过new的方式获取而改成从IOC容器来获取。
3.AOP:Aspect Oriented Programming(面向切面编程),可以将一些可重用的模块通过AOP的编程方式动态的添加/移除,让目标程序增加/去除相应的功能。
二、Spring入门程序(步骤):通过MyEclipse插件的方式完成开发。
MyEclipse中已经集成了spring的插件,使用插件开发可以简化我们开发操作。
1.创建一个web project:spring1_basic
2.通过MyEclipse添加spring的能力:可以自动完成如下三件事情
步骤:项目右键 ==> MyEclipse ==> Project Facets [Capabilities] ==> Install spring facet
1)自动添加Spring需要的jar包:我么可以手动修改为更高的版本。
2)自动创建IOC容器:applicationContext.xml。
3)在web.xml文件中添加一个监听器,加载以上的IOC容器(applicationContext.xml)。
3.在IOC容器(applicationContext.xml)中配置资源,通常使用标签完成配置。
<bean id="grade" class="com.ssm.entity.Grade" s>
<property name="gradeId" value="1">property>
<property name="gradeName" value="一年级">property>
bean>
4.创建项目的包并编写一个测试程序:测试bean注入是否正确。com.ssm.test.GradeTest
public void test1(){
//1.创建一个加载IOC容器applicationContext的对象;
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext.xml");
//2.再通过以上对象调用getBean()方法,从IOC容器中获取bean中的
Grade grade = ac.getBean(Grade.class);
logger.debug(grade);
}
三、IOC容器注入的三种方式:
1.通过“属性方式”注入:使用标签完成bean属性的注入。
<bean id="grade" class="com.ssm.entity.Grade" s>
<property name="gradeId" value="1">property>
<property name="gradeName" value="一年级">property>
bean>
2.通过“p命名空间方式”注入:
在标签中,使用“p:名称”来声明属性名和属性值。
@Test
public void test2(){
//1.创建一个加载IOC容器applicationContext的对象;
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext.xml");
//2.再通过以上对象调用getBean()方法,从IOC容器中获取bean中的
Grade grade = (Grade) ac.getBean("grade2");
logger.info(grade);
}
3.通过“构造方法的方式”注入:
注意:保存在实体中具有相应的构造方法,否则报错。
<bean id="grade3" class="com.ssm.entity.Grade">
<constructor-arg name="gradeId" value="3">constructor-arg>
<constructor-arg name="gradeName" value="三年级">constructor-arg>
bean>
四、在IOC容器中能注入的三种方式:
1.注入“字面值”:
若“字面值”中包含特殊字符(<一年级>)的处理方式:使用CDATA节的来包裹。格式:]]>;以结尾,含有特殊字符的字符串写在中间。
<bean id="grade41" class="com.ssm.entity.Grade">
<property name="gradeId" value="41">property>
<property name="gradeName">
<value>]]>value>
property>
bean>
2.Bean的继承:
在标签中可以使用parent属性来指定当前bean继承哪个父bean的配置,同时可以在单独配置自己的属性覆盖父bean的属性配置。
<bean id="grade42" class="com.ssm.entity.Grade">
<property name="gradeId" value="42">property>
<property name="gradeName" value="四十二年级">property>
bean>
<bean id="grade42_1" parent="grade42">
<property name="gradeName" value="四十二_一年级">property>
bean>
3.Bean的引用:
针对已经存在的Bean,可以通过ref属性直接引用,而不用在单独配置。
<bean id="subject43" class="com.ssm.entity.Subject">
<property name="subjectId" value="43">property>
<property name="subjectName" value="spring">property>
<property name="classHour" value="40">property>
<property name="grade" ref="grade42_1">property>
bean>
4.配置Bean的级联属性:
在多方持有一方的对象时,可以通过“属性.属性名”的方式级联配置1方的属性。
<bean id="subject44" class="com.ssm.entity.Subject">
<property name="subjectId" value="44">property>
<property name="subjectName" value="spring">property>
<property name="classHour" value="50">property>
<property name="grade" ref="grade">property>
<property name="grade.gradeId" value="4">property>
<property name="grade.gradeName" value="四年级">property>
bean>
5.内部Bean:
在多方持有1方的对象时,可以通过配置“内部Bean”的方式配置1方的属性。
6.Bean中的集合属性配置:
在Bean中提供了针对List、Set、Map的配置,分别可以使用、、完成配置。
五、Bean的范围:
在标签中,可以使用scope的属性指定bean范围(作用域),常用值有:singleton、prototype;
1.singleton:单实例的;该bean时一个单实例的对象,所有访问者都使用同一个对象,出现线程安全的问题。是scope的默认值
2.prototype:多实例的;每一个访问者都会有一个属于自己独立的对象,不会出现线程安全的问题,通常对于控制器层的bean需要将scope设置为“prototype”。
六、在IOC容器中管理“数据源”:
使用C3P0数据库连接池作为“数据源”;
1.“数据源连接池”的概念:
2.在IOC容器中如何配置“数据源”:
1)加入C3P0数据库连接池的jar包:
2)使用context:property-placeholder标签加载属性文件(其中包含连接数据库的4个参数)。
<context:property-placeholder location="classpath:db.properties"/>
3)使用标签配置class为C3P0数据库连接池的核心类
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}">property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}">property>
<property name="user" value="${jdbc.user}">property>
<property name="password" value="${jdbc.password}">property>
<property name="initialPoolSize" value="10">property>
<property name="minPoolSize" value="10">property>
<property name="maxPoolSize" value="10">property>
bean>
3.测试程序:测试以上“数据源”配置是否正确:
//创建一个log4j对象,通常声明为静态的,main方法中也可以使用。
public static final Logger logger = Logger.getLogger(GradeTest.class);
public static void main(String[] args) {
//1.创建一个加载IOC容器applicationContext的对象;
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext.xml");
DataSource dataSource = (DataSource) ac.getBean("dataSource");
logger.info(dataSource);
}