整理spring概念、ioc底层原理、bean管理、web整合
是一个开源的轻量级框架【不需要依赖其他框架,可以直接使用的免费框架】
Spring是一个一站式框架:【web层+service层+dao层都可以使用spring完成】
Aop:面向切面编程:扩展一个功能不需要修改源代码实现
Ioc:控制反转:比如有一个类的方法,非静态。调用类里边的方法,需要new一个对象,使用对象调用方法;把用spirng对象的创建不是通过new的方式创建,而是交给spring配置创建类对象。
Spring在javaee的三层结构中,提供了不同的解决技术,例如Hibernate是dao层,struts是web层。
Web层:springMVC
Servie层:spring的ioc
Dao层:spring的jdbcTemplate
Spring的版本用的是4.x的版本。
Hibernate使用的是5.x的版本。
public void testUser() { //加载spring核心配置文件,创建对象 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //根据id的值得到配置创建的对象 User user = (User)context.getBean("user"); user.add();
|
Bean实例化的三种方式
Bean实例化的方式:在spring里边可以通过配置文件创建对象
<bean id="abnormalFactory" class="com.pshdhx.spring.ioc.AbnormalFactory">bean> <bean id="bean3" factory-bean="abnormalFactory" factory-method="getAbnormalBean3">bea |
Bean标签的常用属性
属性注入方式的介绍
创建对象的时候,对类里边的属性设置值。
在spring注入方式中,只提供set和有参方式注入。
Spring的注入属性(有参数构造和set方法)
<bean id="propertydemo1" class="com.pshdhx.spring.ioc.ConstructorPropertyDemo">
<constructor-arg name="username" value="pshdhx">constructor-arg>
bean>
Spring注入对象类型属性(重点)
在action中注入service对象,实现set方法
在service中注入dao对象
<bean id="userDao" class="com.pshdhx.spring.ioc.UserDao">bean>
<bean id="userService" class="com.pshdhx.spring.ioc.UserService">
<property name="userDao" ref="userDao">property>
bean>
P名称空间注入
名称空间:在一个beans的标签中不能有多个相同的属性,后边加:+别名表示多个名称空间。
xmlns:p=http://www.springframework.org/schema/p
<bean id="pNameSpace" class="com.pshdhx.spring.ioc.PNameSpace" p:username="pshdhx">bean>
但是PnameSpace的属性类中还得提供set方法。
Spring注入复杂数据
注入数组,list集合,map集合,properties类型
<bean id="complexProperty" class="com.pshdhx.spring.ioc.ComplexProperty">
<property name="arrs">
<list>
<value>pvalue>
<value>svalue>
<value>hvalue>
<value>dvalue>
<value>hvalue>
<value>xvalue>
list>
property>
<property name="list">
<list>
<value>ppvalue>
<value>ssvalue>
<value>hhvalue>
<value>ddvalue>
<value>hhvalue>
<value>xxvalue>
list>
property>
<property name="map">
<map>
<entry key="nihao" value="hello">entry>
<entry key="好的" value="good">entry>
map>
property>
<property name="properties">
<props>
<prop key="driverclass">com.mysql.jdbc.Driverprop>
<prop key="username">rootprop>
props>
property>
bean>
1) new对象,功能可以实现,效率很低
2实现思想:把加载配置文件和创建对象过程,在服务器启动时候完成
3实现原理
(1) ServletContext 对象
(2)监听器
(3)具体使用:
-在服务器启动时候,为每个项目创建-一个 ServletContext对象
-在ServletContext对象创建时候,使用监听器可以具体到ServletContext对象在什么时候创建
-使用监听器监听到ServletContext对象创建时候,4-加载spring配置文件,把配置文件配置对象创建
-把创建出来的对象放到ServletContext域对象里面( setAttribute方法)。-获取对象时候,到ServletContext域得到( getAttribute 方法)
注解:
准备工作: 导入基本jar包
导入aop的jar包spring-aop-4.2.4.RELEASE.jar
在核心配置文件中引入约束
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
类上边加注解:@Component(value="user") //
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User)context.getBean("user");
user.add();
@Component(value="userService")
public class UserService {
@Autowired //自动装配
private UserDao userDao;
//注解方式不需要set方法
Aspectj:是一个面向切面的框架,它扩展了java语言。Aspetj定义了aop语法所以他有一个专门的编译器用来生成遵守java字节编码的规范的Class文件。
Aspectj是一个基于java语言的框架
Spring2.0以后新增加了对Aspectj切点表达式的支持
@Aspectj是Aspectj1.5新增的功能,通过jdk5注解技术,允许直接再bean类中定义切面。
新版本spring框架,建议使用Aspectj方式开发aop
使用Aspectj需要导入SpringAop和Aspectj相关的包
Aop的操作准备:
Aspectj的Xml配置
<bean id="book" name="book" class="com.pshdhx.spring.aop.Book">bean>
<bean id="enhanceClass" class="com.pshdhx.spring.aop.EnhanceClass">bean>
<aop:config>
<aop:pointcut expression="execution(* com.pshdhx.spring.aop.Book.*(..))" id="pointcut1"/>
<aop:aspect ref="enhanceClass">
<aop:before method="before1" pointcut-ref="pointcut1"/>
<aop:after method="after1" pointcut-ref="pointcut1"/>
<aop:around method="around1" pointcut-ref="pointcut1"/>
aop:aspect>
aop:config>
Aspectj的注解方式
整理spring的jdbcTemplate实现curd操作、spring配置连接池、事务管理、搭建转账环境
@Aspect
public class Mybook {
@Before(value = "execution(* com.pshdhx.spring.aopannotation.Book.*(..))")
public void before() {
System.out.println("before");
}
}
public class TestJDBCTemplate {
@Test
public void add() {
//设置数据库信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver"); //设置数据库的驱动
dataSource.setUrl("jdbc:mysql:///spring_day03");
dataSource.setUsername("root");
dataSource.setPassword("123");
//创建jdbctemplate对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//调用jdbctemplate对象的方法实现操作
String sql = "insert into user values(?,?)";
int rows = jdbcTemplate.update(sql, "pshdhx","HelloWorld");
System.out.println(rows);
}
}
//修改操作
@Test
public void update() {
//设置数据库信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver"); //设置数据库的驱动
dataSource.setUrl("jdbc:mysql:///spring_day03");
dataSource.setUsername("root");
dataSource.setPassword("123");
//创建jdbctemplate对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//调用jdbctemplate对象的方法实现操作
String sql = "update user set password =? where username = ?";
int rows = jdbcTemplate.update(sql, "hello","pshdhx");
System.out.println(rows);
}
//删除操作
@Test
public void delete() {
//设置数据库信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver"); //设置数据库的驱动
dataSource.setUrl("jdbc:mysql:///spring_day03");
dataSource.setUsername("root");
dataSource.setPassword("123");
//创建jdbctemplate对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//调用jdbctemplate对象的方法实现操作
String sql = "delete from user where username=?";
int rows = jdbcTemplate.update(sql, "pshdhx");
System.out.println(rows);
}
DBUtil
查询的实现:
查询返回某一个值
//查询操作
@Test
public void testCount() {
//设置数据库信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver"); //设置数据库的驱动
dataSource.setUrl("jdbc:mysql:///spring_day03");
dataSource.setUsername("root");
dataSource.setPassword("123");
//创建jdbctemplate对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//调用jdbctemplate对象的方法实现操作
String sql = "select count(*) from user";
int rows = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(rows);
}
查询返回某一个对象
//jdbc实现代码
@Test
public void testJDBC() {
java.sql.Connection conn = null;
java.sql.PreparedStatement pstmt = null;
ResultSet rs = null;
//加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
//创建连接
try {
conn = DriverManager.getConnection("jdbc:mysql:///spring_day03", "root", "123");
String sql = "select * from user where username = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "pshdhx");
rs = pstmt.executeQuery();
//遍历结果集
while(rs.next()) {
String username = rs.getString("username");
String password = rs.getString("password");
User user = new User();
user.setUsername(username);
user.setPassword(password);
System.out.println(user);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
rs.close();
pstmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class User{
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
匿名内部类实现封装接口对象
//查询返回某个对象的方法
@Test
public void testObject() {
//设置数据库信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver"); //设置数据库的驱动
dataSource.setUrl("jdbc:mysql:///spring_day03");
dataSource.setUsername("root");
dataSource.setPassword("123");
//创建jdbctemplate对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//调用jdbctemplate对象的方法实现操作
String sql = "select * from user where username = ?";
User user = (User) jdbcTemplate.queryForObject(sql, new rowMapper(),"pshdhx");
System.out.println(user);
}
class rowMapper implements RowMapper
@Override
public User mapRow(ResultSet rs, int num) throws SQLException {
String username = rs.getString("username");
String password = rs.getString("password");
User user = new User();
user.setPassword(password);
user.setUsername(username);
return user;
}
}
查询返回某一个list集合
//查询返回某个List集合的方法
@Test
public void testList() {
//设置数据库信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver"); //设置数据库的驱动
dataSource.setUrl("jdbc:mysql:///spring_day03");
dataSource.setUsername("root");
dataSource.setPassword("123");
//创建jdbctemplate对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//调用jdbctemplate对象的方法实现操作
String sql = "select * from user ";
List
System.out.println(list);
}
添加,修改,删除操作都是update
查询时衍生了三种方法:
查询数量【】
查询对象
查询list集合
Aop:的思想配置
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource">property>
bean>
<tx:advice id="txadvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="account*" propagation="REQUIRED"/>
tx:attributes>
tx:advice>
<aop:config>
<aop:pointcut expression="execution(* com.pshdhx.spring.tx.UserService.*(..))" id="pointcut1"/>
<aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/>
aop:config>
<bean id="userService" class="com.pshdhx.spring.tx.UserService">
<property name="userDao" ref="userDao">property>
bean>
<bean id="userDao" class="com.pshdhx.spring.tx.UserDao">
<property name="jdbcTemplate" ref="jdbcTemplate">property>
bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource">property>
bean>
配置事务管理器
配置事务的增强
配置切面
简介SSH框架整合、action创建的三种方式、值栈、拦截器、Hibernate5.x,spring4.x,SSH框架整合思想
action创建
1、向值栈放数据
Set方法
Push方法
定义变量,生成get方法
2、从值栈获取数据
在jsp中使用struts2标签+ognl获取
Aop和责任链模式
自定义拦截器
继承MethodFilterInterceptor
重写类方法,配置拦截器和action的关联
Hibernate的核心配置文件
如果单纯使用Hibernate框架,核心配置文件名称为Hibernate.cfg.xml和位置src是固定的。Hibernate和spring整合的时候,Hibernate和核心配置文件没有固定的要求
实体类和数据库表的映射关系-使用orm思想
Orm思想:
对象关系映射
数据库信息
Hibernate信息
映射配置
Hibernate操作步骤:
在spring框架对Hibernate框架进行封装,使用hibernateTemplate
整合spring和struts2框架
整合web项目
整合hibernate
运用struts使用过滤器
引入约束
在struts2.xml中引入映射文件