IOC容器Bean对象管理有纯配置文件方式、注解方式、配置类+注解方式,本文讨论的是配置类+注解方式即Java Config的方式管理IOC容器的Bean对象,此种方式没有xml文件配置,使用配置类+注解实现,常用的注解如下:
- @Configuration 作用在配置类上,功能相当于spring的applicationContext.xml文件
- @Bean 作用在方法上,方法返回值对象放入IOC容器,bean id=方法名
- @ComponentScan(basePackages = "com.text") 功能相当于applicationContext.xml中的扫描包配置
示例代码如下:
配置类SpringConfig:
package com.text.config;
import com.text.controller.StudentController;
import com.text.service.StudentService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration //配置类,相当于spring的applicationContext.xml文件
@ComponentScan(basePackages = "com.text") //相当于applicationContext.xml中的扫描包配置
public class SpringConfig {@Bean //方法返回的studentController对象放入IOC容器,bean id=方法名public StudentController studentController(StudentService studentService) {StudentController controller = new StudentController();controller.setStudentService(studentService);return controller;}
}
组件类:
package com.text.dao.impl;
import com.text.dao.StudentDao;
import org.springframework.stereotype.Repository;@Repository
public class StudentDaoImpl implements StudentDao {}
package com.text.service.impl;
import com.text.dao.StudentDao;
import com.text.service.StudentService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;@Service
public class StudentServiceImpl implements StudentService {@Resourceprivate StudentDao studentDao;public StudentDao getStudentDao() {return studentDao;}public void setStudentDao(StudentDao studentDao) {this.studentDao = studentDao;}
}
package com.text.controller;
import com.text.service.StudentService;public class StudentController {private StudentService studentService;public StudentService getStudentService() {return studentService;}public void setStudentService(StudentService studentService) {this.studentService = studentService;}
}
测试类:
package com.text;
import com.text.config.SpringConfig;
import com.text.controller.StudentController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Application {public static void main(String[] args) {//创建基于注解的Spring应用上下文,以纯Java注解的方式来替代XML配置文件来创建和管理Spring容器上下文。ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);String[] beanDefinitionNames = context.getBeanDefinitionNames();for(String beanName:beanDefinitionNames) {System.out.println(beanName + ":" + context.getBean(beanName));}StudentController studentController = (StudentController)context.getBean("studentController");System.out.println(studentController);System.out.println(studentController.getStudentService());/*** 输出:* springConfig:com.text.config.SpringConfig$$EnhancerBySpringCGLIB$$5adc8a5@23282c25* studentDaoImpl:com.text.dao.impl.StudentDaoImpl@7920ba90* studentServiceImpl:com.text.service.impl.StudentServiceImpl@6b419da* studentController:com.text.controller.StudentController@3b2da18f* com.text.controller.StudentController@3b2da18f* com.text.service.impl.StudentServiceImpl@6b419da*/}
}
运行结果分析:
- @ComponentScan(basePackages = "com.text") 说明com.text包项下的通过注解标识的StudentDaoImpl、StudentServiceImpl 对象已被实例化并放入了IOC容器中
- @Configuration标识的SpringConfig类在IOC容器启动时也被对象实例化出来-springConfig
- @Bean标识的方法,其返回值对象也会被放入IOC容器中,bean id为方法名;方法参数的注入从IOC容器中寻找id为studentService的对象(系统只有id=studentServiceImpl的对象),找不到则按照StudentService类型寻找,找到StudentService类型的studentServiceImpl,注入到方法参数中,进而赋值到studentController 的属性studentService
- 从运行结果可以看出,上述实例的对象都是单例,打印出的对象地址都相同