前言
spring作为目前最流行,应用最广泛的后端框架,它有着许多优点与特色,比如应用它IOC(控制翻转)的功能以及spring内部的封装,可以与hibernate,struts进行整合,这里只是简单的介绍其主要功能。
spring
IOC
IOC内部原理
IOC内部使用了映射的原理:
<bean id = "userService" class="cn.itcast.UserService"/>
内部原理如下:
//解析dom4j解析xml文件得到class属性值
String classValue = "class属性值";
//使用反射创建类对象
Class clazz = Class.forName(classValue);
//创建类对象
UserService service = clazz.newInstance();
return service;
Bean实例化
类的无参构造方式
<bean id="user" calss="cn.itcast.ioc.User"></bean>
类的静态工厂方法
类方法:
public class Bean2Factory{
public static Bean2 getBean2(){
return new Bean2();
}
}
配置文件:
<bean id="bean2" class="cn.itcast.bean.Bean2Factory" factory-method="getBean2">
类的实例工厂方法
类方法:
public class Bean3Factory{
public Bean3 getBean3(){
return new Bean3();
}
}
配置文件:
<bean id="bean3Factory" class="cn.itcast.bean.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3">
获取实例化对象
//加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
//获取实例
User user = (User) context.getBean("user");
Bean标签的常用属性
- id属性:对这个bean的属性名,获取该bean的实例时所需的名字。
- class属性:创建对象所在类的全路径。
- name属性:功能与id属性一样,id属性不能包含特殊字符,但是在name属性值里面可以包含特殊字符。
- scope属性:单实例与否。
- singleton:默认值,单实例
- prototype:多实例
属性注入
使用构造函数注入
bean:
public class PropertyDemo1{
pubcli PropertyDemo1(String username){
this.username= username;
}
}
配置文件:
<bean id="demo" class="cn.itcast.property.PropertyDemo1">
<construct-arg name="username" value="谁谁谁"></construct-arg>
</bean>
调用:
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
PropertyDemo1 demo = (demo) context.getBean("demo");
System.out.println(demo.username);
使用set方法注入
bean:
class setBookname{
private String bookname;
public void setBookname(String bookname){
this.bookname = bookname;
}
}
配置文件:
<bean id="book" class="cn.itcast.property.Book">
<property name="bookname" value="嘿嘿嘿"></property>
</bean>
调用:
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
setBookname book = (book) context.getBean("book");
System.out.println(book.bookname);
注入对象类型属性
UserDao:
public class UserDao{
public test(){
System.out.print("test...");
}
}
UserService:
public class UserService{
private UserDao userDao;
public void setUserDao(User userDao){
this.userDao = userDao;
}
}
配置文件:
<bean id="userDao" class="cn.itcast.ioc.UserDao"></bean>
//id为类中的属性名
//ref值与生成的bean的id值相同
<bean id="userService" class="cn.itcast.ioc.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
调用:
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
UserService userService = (UserService) context.getBean("userService");
userService.userDao.test();
注入数组,list集合,map集合,properties类型属性
<bean id="person" class="cn.itcast.property.Person">
<!-- 数组 -->
<property name="arrs">
<list>
<value>小王</value>
<value>小马</value>
<value>小宋</value>
</list>
</property>
<!-- list -->
<property name="list">
<list>
<value>小奥</value>
<value>小金</value>
<value>小普</value>
</list>
</property>
<!-- map -->
<property name="map">
<map>
<entry key="aa" value="lucy"></entry>
<entry key="bb" value="mary"></entry>
<entry key="cc" value="tom"></entry>
</map>
</property>
<!-- properties -->
<property name="properties">
<props>
<prop key="driverclass">com.mysql.jdbc.Driver</prop>
<prop key="username">root</prop>
</props>
</property>
</bean>
IOC注解方式
在spring配置文件中引入约束:
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“在配置文件中开启注解扫描
//base-package:需要扫描注解的包
<context:component-scan base-package=”cn.itcast”>创建注解对象
在bean中类的上方加上注解:@Component(value="...")
bean:
@Component(value="user") //等价于<bean id="user" class="...">
public class User{
public test(){
System.out.println("got it!");
}
}
调用:
public class test(
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
User user = (User) context.getBean("user");
user.test();
//got it!
}
可以了解的是,spring提供了4个注解关键字来实例化bean,其中后3个是Componnet的衍生:
- @Component:都可以使用
- @Controller: web层
- @Service: 业务层
- @Repository: 持久层
注解确定单、多实例
@Scope(value="prototype") //多实例
@Scope(value="singleton") //单实例
注解注入属性
注入基本类型
@Value(value)
bean:
public class test{
@Value("谁谁谁")
private String username;
@Value(123)
private int userid;
}
不过我们想向本类中注入值的情况比较少,掌握即可
注入属性对象类型
- @Autowired:自动检测属性并注入,前提是这个属性对象已经通过spring创建了对象实例,配置文件方式或注释方法都可以。
- Resource(name=”对象名”),对象名是通过spring创建的实例id值或name值
创建属性实例
@Component(value=”userDao”)
class userDao{}
注入属性的两种方式
@Autowired
private UserDao userDao;@Resource(name=”userDao”)
Private UserDao userDao;
配置文件与注解混合使用
可以在配置文件中声明对象的属性类,然后在对象中通过注解注入属性。
配置文件:
<bean id="bean0" class="...">
<bean id="bean0" class="...">
<bean id="bean0" class="...">
类:
@Resource(name="bean0");
private Bean0 bean0;
@Resource(name="bean1");
private Bean0 bean1;
spring中的AOP
名词解释
- Joinpoint(连接点):类里面可以被增强的方法,这些方法被称为连接点。
- Ponitcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截。
- Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
- Aspect(切面): 是切入点和通知(引介)的结合
- 增强:增强的逻辑,成为增强,包含以下类型:
- 前置通知:在方法之前执行
- 后置通知:在方法之后执行
- 异常通知:在方法出现异常时执行
- 最终通知:在后置通知之后执行
- 环绕通知:在方法之前和之后执行
配置文件
引入xml命名空间
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
使用表达式配置切入点(实际增强的方法)
表达式:
execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
- execution(* cn.itcast.aop.Book.add(…))
- execution(* cn.itcast.aop.Book.*(..))
- execution(* .(..))
- 匹配..开头的方法 execution(* save*(..))
AspectJ的aop操作
- AspectJ不是spring的一部分,和spring一起使用aop操作。
- spring2.0以后新增了对AspectJ的支持。
- AspectJ可以用配置文件或注释文件。
配置对象
配置aop操作
aop:config
//配置切入点
<aop:pointcut expression=”execution(* cn.itcast.aop.Book.*(..))” id=”pointcut1”>
//配置切面,将增强用到切入点上
<aop:aspect ref=”myBook”>
<aop:before method=”before1” pointcut-ref=”pointcut”/>
aop:aspect
值得注意的是:
aop:point
标签是在配置切入点,即哪些方法需要被增强,其中expression为表达式,id为自定义名称。aop:aspect
标签是在配置切面,即用哪些增强(方法)来增强切入点。- 在
aop:aspect
内部标签表示的是增强的方式。包含以下标签:- aop:before 前置通知
- aop:after-returning 后置通知
- aop:around 环绕通知
- aop:after-throwing 异常通知
- aop:after 最终通知
AspectJ的注解AOP操作
创建对象
<bean id="book" class="cn.itcast.aop.Book"></bean>
在spring核心配置文件中,开启aop操作
在增强类上使用注解完成aop操作
@Aspect
public class MyBook{
@Before(value=”execution(* cn.itcast.aop.Book.*(..))”)
public void before1(){
System.out.print(“before……..”);
}
}
sping的jdbcTemplate操作
设置数据库信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(“com.mysql.jdbc.Driver”);
dataSource.setUrl(“jdbc.mysql:///database0”);
dataSource.setUsername(“root”);
dataSource.setPassword(“root”);创建jdbcTemplate对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
创建sql语句,并执行jdbcTemplate中的方法
- 增加
String sql = “insert into user value(?,?)”;
int rows = jdbcTemplate.update(sql,”lucy”,”250”);- 修改
String sql = “update user set password =? where username=?”;
int rows = jdbcTemplate.update(sql,”1234”,”lucy”);- 删除
String sql = “delete from user where username=?”;
int rows = jdbcTemplate.update(sql,”lucy”);- 查询
//返回对象
String sql = “select * from user where username=?”;
User user jdbcTemplate.queryForObject(sql,new MyRowMapper(),”mary”);
System.out.println(user);//实现RowMapper
class MyRowMapper implements RowMapper{
@Override
public User mapRow(Result re, int num) throws SQLException{
String username= rs.getString(“username”);
String password = rs.getString(“password”);User user = new User(); user.setUsername(username); user.setPassword(password); }
}
//返回list
String sql = “select * from user”;
Listlist = jdbcTemplate.query(sql,new MyRowMapper()); System.out.println(list);
Spring配置c3p0连接池和dao使用jdbcTemplate
因为配置jdbcTemplate数据库的数据库信息实际上还是创建对象,注入属性。所以同样可以用Spring的AOP进行对象的创建。
导入c3p0以及配合的jarbao
配置c3p0连接池
dao使用jdbcTemplate
- 创建service和dao,配置service和dao对象,并把service注入dao对象
- 创建jdbcTemplate对象
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}- 把模板对象注入dao中
- 在jdbcTemplate对象里注入dataSource
private DataSource dataSource;
privateSQLExceptionTranslator exceptionTranslator;
private boolean lazyInit = true;public void setDataSource(DataSource dataSource){
this.dataSource = dataSource;
}
spring的事务管理
xml方式
在核心配置文件中配置事务管理器
配置事务增强
<tx:advice id=”txadvice” transaction-manager=”transactionManager”>
tx:attributes
<tx:method name=”account*” propagation=”REQUIRED”/>
tx:advice配置切面
aop:config
<aop:pointcut expression=”execution(* cn.itcast.service.OrderService.*(..))” id=”pointcut1”>
<aop:adviser advice-ref=”txadvice” point=ref=”pointcut1”/>
注解方式
配置事务管理器
开启事务注解
<tx:annotation-driven transaction-manager=”transactionManager”/>
在需要使用事务的方法所在类上面添加注解
@Transactional
public class ordersService{}
Last
这里的内容多是视频教学笔记中的内容加上我自己的理解,只是不是很深,只是一个最基本的用法,并且省去了配置环境的问题,比如导入jar包等等,这里面可能有很多错误或不足,因为我也是才开始接触。加油加油!