一:Spring的特点
1、Spring:春天;--给软件行业带来了春天
2、理念:使现有的技术更加实用。本身是大杂烩整合现有的框架技术
3、Spring优点
轻量级框架
Ioc容器---控制反转
Aop面向切面编程
对事物的支持
对框架的支持
4、主要内容
图片1.png
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
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="hello" class="com.aiyin.spring.bean.Hello">
<property name="name" value="Spring"></property>
</bean>
</beans>
测试代码
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
<bean id="hello" class="com.aiyin.spring.bean.Hello">
<property name="name" value="Spring"></property>
</bean>
- 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
第一种 根据参数的下标来设置
<bean id="user" class="com.aiyin.spring.vo.User">
<!-- index指构造方法 参数下标从0开始 -->
<constructor-arg index="0" value="李四"></constructor-arg>
</bean>
第二种 根据参数名称来设置
<bean id="user" class="com.aiyin.spring.vo.User">
<!-- name指参数名 -->
<constructor-arg name="name" value="李四"></constructor-arg>
</bean>
第三种 根据参数类型来设置
<bean id="user" class="com.aiyin.spring.vo.User">
<!-- 参数类型 -->
<constructor-arg type="java.lang.String" value="李四"></constructor-arg>
</bean>
三:配置文件详解
1、align:为bean设置别名,可以设置多个别名
<!-- 设置别名 -->
<alias name="user" alias="aaa"/>
2、bean的配置
<!-- bean就是java对象 由spring来创建和管理 -->
<!-- id是bean的标识符 要唯一 如果没有配置id,name默认标识符
如果配置id,又配置了name 那么name是别名
name可以设置多个别名 分隔符可以 是 空格 逗号 分号
class是bean的全限定名=包名+类名
如果不配置 id,和name 那么可以根据applicationContext.getBean(Class) 获取对象
-->
<bean id="user" name="user2,u3 u4" class="com.aiyin..."
3、团队协作开发通过improt来实现
import resource="com/aiyin/spring/bean/beans.xml"/>
自动装配
<bean id="userDao" class="com.aiyin.spring02.dao.impl.userDaoMySqlImpl"></bean>
<!-- autowire自动装配,简化spring配置
byName根据名称(set方法名后面的)去查找对应的bean,如果有则装配上
-->
<bean id="userService" class="com.aiyin.spring02.service.impl.userServiceImpl" autowire="byName">
</bean>
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;}
<!--扫描哪些包可以使用注解
-->
<context:component-scan base-package="com.*" />
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中的作用
提供声明式服务
允许用户实现自定义切面
不改变原有代码,增加新的功能
传统设计模式
图片2.png3、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
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="userService" class=" com.aiyin.springaop.service.UserServiceImpl"/>
<bean id="log" class="com.aiyin.springaop.log.Log"/>
<aop:config>
<aop:pointcut expression="execution(* com.aiyin.springaop.*.*.*(..))" id="pointcut"/>
<aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
</aop:config>
</beans>
- 后置通知
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
<bean id="userService" class=" com.aiyin.springaop.service.UserServiceImpl"/>
<bean id="log" class="com.aiyin.springaop.log.Log"/>
<aop:config>
<aop:aspect ref="log">
<aop:pointcut expression="execution(* com.aiyin.springaop.service.*.*(..))" id="pointcut"/>
<aop:before method="before" pointcut-ref="pointcut"/>
<aop:after-returning method="after" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
第三种 通过注解来实现
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
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.*" />
<aop:aspectj-autoproxy />
网友评论