一:Spring的特点
1、Spring:春天;--给软件行业带来了春天
2、理念:使现有的技术更加实用。本身是大杂烩整合现有的框架技术
3、Spring优点
轻量级框架
Ioc容器---控制反转
Aop面向切面编程
对事物的支持
对框架的支持
4、主要内容
5、Ioc--inversion of control控制反转
对象由原来程序本身来创建,变为了程序接收对象。程序员主要精力集中于业务实现。实现了service和dao的解耦工作。Service层和dao层实现了分离。没有直接依赖关系。
6、hello spring
步骤:导入相关jar包
commons-logging-1.1.1.jar
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
编写spring配置文件(名称可以自己起)习惯用applicationContext.xml
Hello.java
public class Hello {
private String name;
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("hello,"+name);
}
}
Bean.xml
测试代码
public class Test {
public static void main(String[] args) {
//解析beans.xml文件 生成管理相应的bean对象
BeanFactory context = new ClassPathXmlApplicationContext("beans.xml");
//Hello hello = (Hello)context.getBean("h4");
Hello hello= context.getBean(Hello.class);
hello.show();
}
}
思考?
Hello对象由谁创建?(Hello对象由Spring容器创建的)
Hello对象属性是怎么设置的?(Hello对象属性是Spring容器来设置的)
这个过程叫做控制反转
控制的内容:指谁来控制对象的创建。。传统的应用程序对象的创建是由程序本身控制的。使用Spring后,是由spring来创建对象的。
反转:正转指程序来创建对象,反转指程序本身不去创建对象,而变为被动的接收的对象。
总结: 以前对象是由程序本身来创建,使用Spring后,程序变为被动接收spring创建好的对象
二:使用Ioc来创建对象有3种方式
- A)通过无参的构造方法来创建set方法注入
user.java
public class Hello {
Public Hello (){
System.out.println("user通过无参构造方法创建");
}
private String name;
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("hello,"+name);
}
}
bean.xml
- B)通过有参的构造方法来创建 构造方法注入
user.java
public class User {
public User(String name) {
super();
this.name = name;
}
private String name;
public void show(){
System.out.println("name="+name);
}
bean.xml
第一种 根据参数的下标来设置
第二种 根据参数名称来设置
第三种 根据参数类型来设置
三:配置文件详解
1、align:为bean设置别名,可以设置多个别名
2、bean的配置
3、团队协作开发通过improt来实现
import resource="com/aiyin/spring/bean/beans.xml"/>
自动装配
MicrosoftInternetExplorer4
0
2
DocumentNotSpecified
7.8 磅
Normal
0
@font-face{font-family:"Times New Roman";}@font-face{font-family:"宋体";}@font-face{font-family:"Calibri";}@font-face{font-family:"Consolas";}@font-face{font-family:"Arial";}p.MsoNormal{mso-style-name:正文;mso-style-parent:"";margin:0pt;margin-bottom:.0001pt;mso-pagination:none;text-align:justify;text-justify:inter-ideograph;font-family:Calibri;mso-fareast-font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;}span.10{font-family:'Times New Roman';}span.15{font-family:'Times New Roman';color:rgb(0,0,255);text-decoration:underline;text-underline:single;}span.msoIns{mso-style-type:export-only;mso-style-name:"";text-decoration:underline;text-underline:single;color:blue;}span.msoDel{mso-style-type:export-only;mso-style-name:"";text-decoration:line-through;color:red;}@page{mso-page-border-surround-header:no; mso-page-border-surround-footer:no;}@page Section0{}div.Section0{page:Section0;}
xmlns:context=*"http://www.springframework.org/schema/context"**
*
xsi:schemaLocation=*http://www.springframework.org/schema/context*
* ** **http://www.springframework.org/schema/context/spring-context.xsd"**
*
@Autowired按类型装配
set
方法可以删除
@Resource 按照名称来装配注入的
@Autowired @Qualifier("userDao") 如果当
[**spring**](http://lib.csdn.net/base/javaee)上下文中存在不止一个
UserDao类型的
bean
时
@Component 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
@Service 业务层
@Controller 控制层
@Repository 持久层
spring使用完全注解开发时,很方便,前提条件是对基本配置足够掌握
userDaoMySqlImpl.java
@Component
public class userDaoMySqlImpl implements userDao {
@Override
public void getUser() {
System.out.println("Mysql得到数据");
}
}
serServiceImpl.java
public class userServiceImpl implements userService {
@Autowired
private userDao userDao;
@Override
public void getUser() {
userDao.getUser();
}
}
@Autowired是根据类型进行自动装配的。如果当spring上下文中存在不止一个UserDao类型的bean时,我们可以使用@Qualifier配合@Autowired来解决这些问题
userDaoMySqlImpl.java
@Repository(value ="userDao")
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
}
}
userServiceImpl.java
@Autowired
public void setUserDao(@Qualifier("userDao")userDao userDao) {
this.userDao = userDao;
}
四:面向切面编程(AOP)
1、aop:Aspect Oriented Programming面向切面编程
2、aop在 spring中的作用
提供声明式服务
允许用户实现自定义切面
不改变原有代码,增加新的功能
传统设计模式
3、aop好处
使得真实角色处理的业务更加纯粹,不再去关注一些公共的事情
公共业务由代理来完成---实现业务的分工
公共业务发生改变时,变得更加集中和方便
4、名词解释
关注点:增加的某个业务。如日志。安全。缓存。事务等
切面(Aspect):一个关注点的模块化
通知(Advice):在切面的某个特定的连接点上执行的动作
织入(Weaving):把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象
5、使用spring实现aop
第一种实现方式-----通过springapi来实现
- Log.java(前置通知)
public class Log implements MethodBeforeAdvice{
/**
* @param method 被调用方法对象
* @param args 被调用的方法的参数
* @param target 被调用的方法的目标对象
* */
@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
System.out.println(target.getClass().getName() + "的" + method.getName()
+ "方法被执行");
}
Service 层 用户增删改查
Beans.xml
- 后置通知
public class AfterLog implements AfterReturningAdvice{
/**
* 目标方法执行后执行的通知
* returnValue--返回值
* method 被调用的方法对象
* args 被调用的方法对象的参数
* target 被调用的方法对象的目标对象
* */
@Override
public void afterReturning(Object returnValue, Method method,
Object[] args, Object target) throws Throwable {
System.out.println(target.getClass().getName()+"的"+method.getName()+"被成功执行,返回值是:"+returnValue);
}
Aop的重要性:很重要
Spring aop就是将公共的业务(如日志,安全等)和领域业务结合。当执行领域业务时将会把公共业务加进来。其本质就是动态代理
第二种方式实现aop:自定义类来实现
Log.java
public class Log {
public void before() {
System.out.println("-------方法执行前---------");
}
public void after() {
System.out.println("-------方法执行后----------");
}
}
Beans.xml
第三种 通过注解来实现
Log.java
@Aspect
@Component
public class Log {
@Before("execution(* com.aiyin.springaop.service.*.*(..))")
public void before() {
System.out.println("-------方法执行前---------");
}
@After("execution(* com.aiyin.springaop.service.*.*(..))")
public void after() {
System.out.println("-------方法执行后----------");
}
@Around("execution(* com.aiyin.springaop.service.*.*(..))")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕前");
System.out.println("签名:"+pjp.getSignature());
// 执行目标方法
Object result =pjp.proceed();
System.out.println("环绕后");
return result;
}
UserServiceImpl.java
@Service("userService")
public class UserServiceImpl implements UserService {
@Override
public void add(int a) {
System.out.println("增加用户");
}
@Override
public void update() {
System.out.println("修改用户");
}
.................
beans.xml