Spring笔记
Spring5
1.前身:interface21
2.发明者:Rod Johnson(悉尼大学 双学位 音乐学 计算机学)
3.轻量级、防入侵
4.优点:轻量级的控制反转(IOC)和面向切面编程(AOP)
5.Spring框架主要由七部分组成,分别是Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC
6.弊端:“配置地狱”
一、作用域(scope)
Scope
二、动态代理
-
动态代理和静态代理角色一样
-
动态代理的代理类是动态生成的,不是我们直接写好的!
-
动态代理分为两大类:基于接口的动态代理,基于类的动态代理
-
基于接口---JDK动态代理
-
基于类:cglib
-
java字节码实现:javasist(东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。)
两个类:Proxy:代理,InvocationHandler:调用处理程序并返回结果(调用处理程序)
-
三、依赖
org.springframework
spring-webmvc
5.2.0.RELEASE
四、创建程序
-
导入依赖,创建Model项目
-
创建实体类
-
配置xml文件
<?xml version="1.0" encoding="UTF-8"?>
-
创建测试类
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("xml文件名"); 类名 bean = context.getBean("id名",强转类); System.out.println(bean.toString());
五、注入对象
-
在Xml文件中创建
六、注解方式IOC/DI
- IOC---控制反转
- DI---依赖注入
七、自动装配Bean
-
显式装配
<?xml version="1.0" encoding="UTF-8"?>
-
Java装配
-
隐式装配
- byName
<?xml version="1.0" encoding="UTF-8"?>
byName会自动在容器上下文中找与set后的名称对应的beanId
- byType
<?xml version="1.0" encoding="UTF-8"?>
byType会自动在容器上下文中找与自己对象属性类型相同的类与之对应
八、注解实现自动装配
jdk1.5支持注解,spring2.5支持注解
使用注解须知:
- 导入约束:context约束
- 配置注解的支持:
<?xml version="1.0" encoding="UTF-8"?>
- @Autowired
- 可使用在属性或set方法上
- 可以将set方法去除
- 当名字或类型有一个相同,则可以在xml文件中更改id对应的值,反之不可以
- 如果有上述情况,则可以将@Autowired和@Qualifier(value="dog222")配合使用
- @Resource
- 和@Autowired性质差不多,但不可以用在set上
- 先找byName再byType,最后找不到就报错
- 当然也可以传参,例如@Resource(name="dog111")
- 小结
- 二者均是用来自动装配的,都可以放在属性字段上
- @Autowired默认通过byType方式,如果有多个类型相同的再按照byName
- @Resouce默认通过byName方式,如果找不到名字,则通过byType实现,如果二者都找不到,就报错
九、使用注解开发
在使用spring4之后,要使用注解开发,必须要保证AOP的包导入了
-
创建XML文件
<?xml version="1.0" encoding="UTF-8"?>
-
在实体类中使用以下注解
-
@Component:注册类到IOC容器
-
@Resource:javax的自动装配
-
@Autowired:spring的自动装配
-
@Value:给属性赋值
-
@Qualifier :与@Autowired配合使用
-
十、AOP
? AOP(Aspect Oriented Programming):面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护。Aop是OOP的延续。是函数式编程的一种衍生泛型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合性降低,提高程序的可重用性,同时提高了开发效率。
注意,在pom.xml中导入依赖
org.aspectj
aspectjweaver
1.9.8
1.使用SpringAPI接口
-
创建接口
public interface UserService { public void add(); public void delete(); public void update(); public void select(); }
-
接口实现类
public class UserServiceImpl implements UserService{ @Override public void add() { System.out.println("增加了一个用户"); } @Override public void delete() { System.out.println("删除了一个用户"); } @Override public void update() { System.out.println("更改了一个用户"); } @Override public void select() { System.out.println("查找了一个用户"); } }
-
创建日志
- 执行之前
import org.springframework.aop.MethodBeforeAdvice; import java.lang.reflect.Method; public class Log implements MethodBeforeAdvice { //method:要执行的目标对象的方法 //args:参数 //target:目标对象 @Override public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println(target.getClass().getName() + "的" + method.getName() + "被执行了"); } }
- 执行之后
import org.springframework.aop.AfterReturningAdvice; import java.lang.reflect.Method; public class AfterLog implements AfterReturningAdvice { @Override public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("执行了"+method.getName()+"方法,返回结果为"+returnValue); } }
-
配置xml文件
<?xml version="1.0" encoding="UTF-8"?>
-
测试类
import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ @Test public void t0(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService user = context.getBean("user",UserService.class); user.add(); } }
2.自定义类实现
与方式一不同的地方为xml文件
<?xml version="1.0" encoding="UTF-8"?>
方式二并没有方式一强大
3.注解实现
-
创建一个业务接口
-
实现该接口的类添加如下注解
import org.springframework.stereotype.Component; @Component("userServiceImpl") public class UserServiceImpl implements UserService{ public void add(){ System.out.println("用户添加"); } }
-
编写切面类
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Component @Aspect public class AnnoPoint { @Before("execution(* com.dragon.service.UserServiceImpl.*(..))") public void before(){ System.out.println("===方法执行前==="); } }
@Before("execution(* com.dragon.service.UserServiceImpl.*(..))"),注意此句是切到指定类中的某个方法中
-
配置applicationContext.xml文件
<?xml version="1.0" encoding="UTF-8"?>
-
利用测试类正常测试
注意事项,在配置xml文件时,三行代码缺一不可