实现Spring底层机制-01
主要实现:初始化IOC容器+依赖注入+BeanPostProcessor机制+AOP
前面我们实际上已经使用代码简单实现了:
- Spring XML 注入 bean (Spring基本介绍02)
- Spring 注解方式注入 bean (Spring管理Bean-IOC-04)
- Spring AOP 动态代理实现 (AOP-01)
1.引出问题
1.1原生Spring如何实现依赖注入、singleton和prototype
例子
1.创建新的Maven项目:
2.在pom.xml文件中添加 spring 开发的基本包:
<dependencies>
<!--加入 spring 开发的基本包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.8</version>
</dependency>
<!--加入spring开发切面编程需要的包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.8</version>
</dependency>
</dependencies>
3.src/main/java/ 目录下创建包 com/li/component,在该包下分别创建UserDao.java、UserService.java、UserAction.java
UserDao:
package com.li.component;
import org.springframework.stereotype.Component;
/**
* @author 李
* @version 1.0
*/
//也可以使用 @Repository
@Component
public class UserDao {
public void hi() {
System.out.println("UserDao-hi()---");
}
}
UserService:
package com.li.component;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author 李
* @version 1.0
*/
//也可以使用 @Service
@Component
public class UserService {
//定义属性
//也可以使用 @Resource
@Autowired
private UserDao userDao;
public void m1() {
userDao.hi();
}
}
UserAction:
package com.li.component;
import org.springframework.stereotype.Component;
/**
* @author 李
* @version 1.0
* 一个 Controller
*/
//也可以使用 @Controller
@Component
public class UserAction {
}
4.在 src/main/resources 目录下创建 spring 的容器文件 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: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
https://www.springframework.org/schema/context/spring-context.xsd">
<!--配置自动扫描的包,同时引入对应的名称空间-->
<!--说明:
1.如果是普通的java项目,beans.xml 放在src 目录下即可
2.如果是maven项目,beans.xml文件就要放在 src/main/resources 目录下-->
<context:component-scan base-package="com.li.component"/>
</beans>
5.测试类中获取配置的bean,并输出对象的地址值
package com.li;
import com.li.component.UserAction;
import com.li.component.UserDao;
import com.li.component.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author 李
* @version 1.0
*/
public class AppMain {
public static void main(String[] args) {
//测试是否可以得到spring容器中的bean
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
UserAction userAction = (UserAction) ioc.getBean("userAction");
UserAction userAction2 = (UserAction) ioc.getBean("userAction");
System.out.println(&