文章目录
 
 - 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.测试
 
    
    @Test
    public 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 {
    @Test
    public 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 {
    
    
    
    @Autowired
    UserDao userDao;
    public void sayHi() {
        userDao.sayHi();
    }
}
 
4.测试
 
    
    @Test
    public 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 {
    
    
    
    
    @Resource
    UserDao userDao;
    public void sayHi() {
        userDao.sayHi();
    }
}
 
4.泛型依赖注入
 
1.基本说明
 
1.基本介绍
 

 
2.参考关系图
 
