文章目录
- 1.基本使用
- 1.基本介绍
- 2.快速入门
- 1.引入jar包
- 2.MyComponent.java
- 3.UserAction.java
- 3.UserDao.java
- 4.UserService.java
- 5.beans05.xml
- 6.断点查看bean对象是否创建
- 7.测试
- 3.注意事项和细节
- 2.自己实现spring注解
- 1.需求分析
- 2.思路分析图
- 3.编写自定义注解ComponentScan
- 4.编写配置类SunSpringConfig
- 5.编写容器SunSpringApplicationContext
- 6.测试
- 3.自动装配
- 1.AutoWired方式
- 1.基本说明
- 2.UserDao.java
- 3.UserService.java
- 4.测试
- 2.Resource方式(推荐)
- 1.基本说明
- 2.UserDao.java
- 3.UserService.java
- 4.泛型依赖注入
-
1.基本使用
1.基本介绍
2.快速入门
1.引入jar包
2.MyComponent.java
package com.sxs.spring.component;import org.springframework.stereotype.Component;@Component
public class MyComponent {
}
3.UserAction.java
package com.sxs.spring.component;import org.springframework.stereotype.Controller;
@Controller
public class UserAction {
}
3.UserDao.java
package com.sxs.spring.component;import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
}
4.UserService.java
package com.sxs.spring.component;import org.springframework.stereotype.Service;
@Service
public class UserService {
}
5.beans05.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"><context:component-scan base-package="com.sxs.spring.component"></context:component-scan>
</beans>
6.断点查看bean对象是否创建
7.测试
@Testpublic void setBeanByAnnotation() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans05.xml");MyComponent component = ioc.getBean(MyComponent.class);UserAction action = ioc.getBean(UserAction.class);UserDao userDao = ioc.getBean(UserDao.class);UserService userService = ioc.getBean(UserService.class);System.out.println("" + component + action + userDao + userService);}
3.注意事项和细节
2.自己实现spring注解
1.需求分析
2.思路分析图
3.编写自定义注解ComponentScan
package com.sxs.spring.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ComponentScan {String value() default "";
}
4.编写配置类SunSpringConfig
package com.sxs.spring.annotation;
@ComponentScan(value = "com.sxs.spring.component")
public class SunSpringConfig {}
5.编写容器SunSpringApplicationContext
package com.sxs.spring.annotation;import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import java.io.File;
import java.net.URL;
import java.util.concurrent.ConcurrentHashMap;
public class SunSpringApplicationContext {private Class configClass;private final ConcurrentHashMap<String, Object> ioc = new ConcurrentHashMap<>();public SunSpringApplicationContext(Class configClass) throws ClassNotFoundException, InstantiationException, IllegalAccessException {this.configClass = configClass;ComponentScan componentScan = (ComponentScan) this.configClass.getDeclaredAnnotation(ComponentScan.class);String path = componentScan.value();ClassLoader classLoader = SunSpringApplicationContext.class.getClassLoader();path = path.replace(".", "/");URL resource = classLoader.getResource(path);File file = new File(resource.getFile());if (file.isDirectory()) {File[] files = file.listFiles();for (File f : files ) {String absolutePath = f.getAbsolutePath();if (absolutePath.endsWith(".class")) {String className = absolutePath.substring(absolutePath.lastIndexOf("\\") + 1, absolutePath.indexOf("."));String fullPath = path.replace("/", ".") + "." + className;Class<?> aClass = classLoader.loadClass(fullPath);if (aClass.isAnnotationPresent(Component.class) || aClass.isAnnotationPresent(Controller.class)|| aClass.isAnnotationPresent(Service.class) || aClass.isAnnotationPresent(Repository.class)) {Class<?> clazz = Class.forName(fullPath);Object o = clazz.newInstance();ioc.put(StringUtils.uncapitalize(className), o);}}}System.out.println("ok");}}public Object getBean(String name) {return ioc.get(name);}}
6.测试
package com.sxs.spring.annotation;import org.junit.jupiter.api.Test;
public class test {@Testpublic void SunSpringApplicationContextTest() throws ClassNotFoundException, InstantiationException, IllegalAccessException {SunSpringApplicationContext ioc = new SunSpringApplicationContext(SunSpringConfig.class);Object myComponent = ioc.getBean("myComponent");Object userAction = ioc.getBean("userAction");Object userDao = ioc.getBean("userDao");Object userService = ioc.getBean("userService");System.out.println("" + myComponent + userService + userAction + userDao);}
}
3.自动装配
1.AutoWired方式
1.基本说明
2.UserDao.java
package com.sxs.spring.component;import org.springframework.stereotype.Repository;
@Repository
public class UserDao {public void sayHi() {System.out.println("hi");}
}
3.UserService.java
package com.sxs.spring.component;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {@AutowiredUserDao userDao;public void sayHi() {userDao.sayHi();}
}
4.测试
@Testpublic void autowireTest() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans05.xml");UserService bean = ioc.getBean("userService", UserService.class);bean.sayHi();}
2.Resource方式(推荐)
1.基本说明
2.UserDao.java
package com.sxs.spring.component;import org.springframework.stereotype.Repository;
@Repository
public class UserDao {public void sayHi() {System.out.println("hi");}
}
3.UserService.java
package com.sxs.spring.component;import org.springframework.stereotype.Service;import javax.annotation.Resource;
@Service
public class UserService {@ResourceUserDao userDao;public void sayHi() {userDao.sayHi();}
}
4.泛型依赖注入
1.基本说明
1.基本介绍
2.参考关系图