文章目录  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.泛型依赖注入     
 
 
 
package  com. sxs. spring. component ; import  org. springframework. stereotype.  Component ; @Component 
public  class  MyComponent  { 
} package  com. sxs. spring. component ; import  org. springframework. stereotype.  Controller ; 
@Controller 
public  class  UserAction  { 
} package  com. sxs. spring. component ; import  org. springframework. stereotype.  Repository ; 
@Repository 
public  class  UserDao  { 
} package  com. sxs. spring. component ; import  org. springframework. stereotype.  Service ; 
@Service 
public  class  UserService  { 
} <?xml version="1.0" encoding="UTF-8"?> 
< beansxmlns = " 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-scanbase-package = " com.sxs.spring.component" > </ context: component-scan> </ beans> 
 
    @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) ; } 
 
 
 
 
 
 
 
 
 
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  "" ;  
} package  com. sxs. spring. annotation ; 
@ComponentScan ( value =  "com.sxs.spring.component" )  
public  class  SunSpringConfig  { } 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 > =  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 < ? > =  classLoader. loadClass ( fullPath) ; if  ( aClass. isAnnotationPresent ( Component . class )  ||  aClass. isAnnotationPresent ( Controller . class ) ||  aClass. isAnnotationPresent ( Service . class )  ||  aClass. isAnnotationPresent ( Repository . class ) )  { Class < ? > =  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) ; } } 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) ; } 
} 
 
 
package  com. sxs. spring. component ; import  org. springframework. stereotype.  Repository ; 
@Repository 
public  class  UserDao  { public  void  sayHi ( )  { System . out. println ( "hi" ) ; } 
} 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 ( ) ; } 
}     @Test public  void  autowireTest ( )  { ApplicationContext  ioc =  new  ClassPathXmlApplicationContext ( "beans05.xml" ) ; UserService  bean =  ioc. getBean ( "userService" ,  UserService . class ) ; bean. sayHi ( ) ; } 
 
 
package  com. sxs. spring. component ; import  org. springframework. stereotype.  Repository ; 
@Repository 
public  class  UserDao  { public  void  sayHi ( )  { System . out. println ( "hi" ) ; } 
} 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 ( ) ; } 
}