Java SSM框架 Spring入门及IOC详解
版权声明:本文为博主原创文章,未经博主允许不得转载。 转载联系邮箱:1363119685@qq.com
Copyright © 2018 DAR林克斯 保留所有权利
Java SSM框架 Spring入门及IOC
一、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:注入Grade实体的两个属性 -->
<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:注入Grade实体的两个属性 -->
<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.通过“构造方法的方式”注入:
注意:保存在实体中具有相应的构造方法,否则报错。
<!-- 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节的来包裹。格式:<![CDATA[<内容>]]>;以<![CDATA[开头,以]]>结尾,含有特殊字符的字符串写在中间。
<bean id="grade41" class="com.ssm.entity.Grade">
<property name="gradeId" value="41"></property>
<property name="gradeName">
<value><![CDATA[<四十一年级>]]></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的配置,分别可以使用、、
六、在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>
<!-- C3P0数据库连接池中的个性化配置
intialPoolSize:初始化连接数;
minPoolSize:最小连接数;
maxPoolSize:最大连接数。
-->
<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);
}