1.SpringIOC
Spring是一个基于IOC和AOP的结构J2EE系统的框架
在src目录下新建applicationContext.xml文件
applicationContext.xml是Spring的核心配置文件,
通过关键字c即可获取Category对象,该对象获取的时候,即被注入了字符串"category 1“到name属性中
Category.java
package com.how2java.pojo;
public class Category {
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int id;
private String name;
}
applicationContext.xml
<bean name="c" class="com.how2java.pojo.Category">
<property name="name" value="category 1" />
</bean>
通过一个test.java
test.java
Category c = (Category) context.getBean("c");
System.out.println(c.getName());
得到结果
category 1
传统的方式:
通过new 关键字主动创建一个对象
IOC方式
对象的生命周期由Spring来管理,直接从Spring那里去获取一个对象。 IOC是反转控制 (Inversion Of Control)的缩写,就像控制权从本来在自己手里,交给了Spring。
传统方式:相当于你自己去菜市场new 了一只鸡,不过是生鸡,要自己拔毛,去内脏,再上花椒,酱油,烤制,经过各种工序之后,才可以食用。
用 IOC:相当于去馆子(Spring)点了一只鸡,交到你手上的时候,已经五味俱全,你就只管吃就行了。
2.spring 注入对象
Product.java
package com.how2java.pojo;
public class Product {
private int id;
private String name;
private Category category;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
}
applicationContext.xml
<bean name="c" class="com.how2java.pojo.Category">
<property name="name" value="category 1" />
</bean>
<bean name="p" class="com.how2java.pojo.Product">
<property name="name" value="product1" />
<property name="category" ref="c" />
</bean>
TestSpring.java
Product p = (Product) context.getBean("p");
System.out.println(p.getName());
System.out.println(p.getCategory().getName());
得到结果
product1
category 1
3.spring注入IOC/DI
applicationContext.xml
<context:annotation-config/>
表示告诉Spring要用注解的方式进行配置
注入对象的21行注释掉,这个行为在后面将使用注解来完成
<context:annotation-config/>
<bean name="c" class="com.how2java.pojo.Category">
<property name="name" value="category 1" />
</bean>
<bean name="p" class="com.how2java.pojo.Product">
<property name="name" value="product1" />
<!-- <property name="category" ref="c" /> -->
</bean>
Product.java
在Product.java的category属性前加上@Autowired注解
public class Product {
private int id;
private String name;
@Autowired
private Category category;
public int getId() {
return id;
}
........
}
TestSpring.java
Product p = (Product) context.getBean("p");
System.out.println(p.getName());
System.out.println(p.getCategory().getName());
得到结果
product1
category 1
4.springAOP 面向切面编程
- 功能分两大类,辅助功能和核心业务功能
- 辅助功能和核心业务功能彼此独立进行开发
- 比如登陆功能,即便是没有性能统计和日志输出,也可以正常运行
- 如果有需要,就把"日志输出" 功能和 “登陆” 功能 编织在一起,这样登陆的时候,就可以看到日志输出了
- 辅助功能,又叫做切面,这种能够选择性的,低耦合的把切面和核心业务功能结合在一起的编程思想,就叫做切面编程
ProductService.java
package com.how2java.service;
public class ProductService {
public void doSomeService(){
System.out.println("doSomeService");
}
}
TestSpring
引入切面之前,调用该业务类
public class TestSpring {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
ProductService s = (ProductService) context.getBean("s");
s.doSomeService();
}
}
得到
doSomeService
LoggerAspect.java准备日志切面
该日志切面的功能是 在调用核心功能之前和之后分别打印日志,切面就是原理图中讲的那些辅助功能。
Object object = joinPoint.proceed();
public class LoggerAspect {
public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("start log:" + joinPoint.getSignature().getName());
Object object = joinPoint.proceed();
System.out.println("end log:" + joinPoint.getSignature().getName());
return object;
}
}
TestSpring.java
public class TestSpring {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "applicationContext.xml" });
ProductService s = (ProductService) context.getBean("s");
s.doSomeService();
}
}
得到答案
start log:doSomeService
doSomeService
end log:doSomeService
5.spring注解方式 AOP
ProductService.java
使用@Component(“s”) 注解ProductService 类
@Component("s")
public class ProductService {
public void doSomeService(){
System.out.println("doSomeService");
}
}
LoggerAspect.java
@Aspect 注解表示这是一个切面
@Component 表示这是一个bean,由Spring进行管理
@Around(value = “execution(* com.how2java.service.ProductService.*(…))”) 表示对com.how2java.service.ProductService 这个类中的所有方法进行切面操作
@Aspect
@Component
public class LoggerAspect {
@Around(value = "execution(* com.how2java.service.ProductService.*(..))")
public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("start log:" + joinPoint.getSignature().getName());
Object object = joinPoint.proceed();
System.out.println("end log:" + joinPoint.getSignature().getName());
return object;
}
}
applicationContext.xml
<context:component-scan base-package="com.how2java.aspect"/>
<context:component-scan base-package="com.how2java.service"/>
<aop:aspectj-autoproxy/>
TestSpring.java
public class TestSpring {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "applicationContext.xml" });
ProductService s = (ProductService) context.getBean("s");
s.doSomeService();
}
}
得到答案
start log:doSomeService
doSomeService
end log:doSomeService
6.注解方式测试
TestSpring.java
修改TestSpring, 并运行
-
@RunWith(SpringJUnit4ClassRunner.class)
表示这是一个Spring的测试类 -
@ContextConfiguration(“classpath:applicationContext.xml”)
定位Spring的配置文件 -
@Autowired
给这个测试类装配Category对象 -
@Test
测试逻辑,打印c对象的名称
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestSpring {
@Autowired
Category c;
@Test
public void test(){
System.out.println(c.getName());
}
}
得到答案
category 1
本文章代码
https://how2j.cn/k/spring/spring-ioc-di/87.html