Spring IOC容器Bean对象管理-注解方式
目录
1、Bean对象常用注解介绍
2、注解示例说明
1、Bean对象常用注解介绍
- @Component 通用类组件注解,该类被注解,IOC容器启动时实例化此类对象
- @Controller 注解控制器类
- @Service 注解业务逻辑类
- @Respository 注解和数据库操作的类,如DAO类
- @Resource 装配注解,优先按名称装配,如果名称匹配不上,则按照类型匹配
- @Autowired 装配注解,按类型装配(Spring 内置)
- @Inject 装配注解,按类型装配(JSR-330标准)
- @PostConstruct 方法注解,功能参考xml文件中的init-method,在实例化对象后自动执行
- @Scope Bean属性注解,功能参考xml文件中的Scope属性,非WEB环境有多例和单例两种,注解不写value或者不写此注解的情况下,默认是单例
- @Value 属性注解,为Bean对象注入静态数据,通常属性注入的值来自某个配置文件
2、注解示例说明
IOC容器注解方式配置Bean需要如下步骤:
1、applicationContext.xml加入扫描的包,此包项下的类被IOC容器扫描,如有注解,则实例化对象
<!-- 扫描注解包-->
<context:component-scan base-package="com.text"/>
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:config.properties"/>
配置文件config.properties(示例jdbc连接)
jdbc.url=jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxx
2、配置Bean注解
package com.text.dao.impl;
import com.text.dao.StudentDao;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
@Repository
@Scope("prototype") //多例,只是程序模拟,实际项目上大部分是单例
public class StudentDaoImpl implements StudentDao {
@Value("${jdbc.url}")
private String url;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
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 {
/**
* @Resource 注解后,先从容器中找bean名称=studentDao的对象,没找到(系统中实例对象名称是studentDaoImpl)
* 再通过类型StudentDao寻找,找到studentDaoImpl,注入到studentServiceImpl对象中
* 由于studentDao是私有属性,IOC容器会通过反射技术将studentDao改为puclic属性(修改modifier值),
* 然后赋值,赋值后再次将studentDao设置私有属性;此种方式和xml中的property的方式不同,property的方式是通过
* 反射调用SetStudentDao方法实现注入
*/
@Resource
private StudentDao studentDao;
public StudentDao getStudentDao() {
return studentDao;
}
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}
}
测试类:
package com.text.entity;
import com.text.dao.StudentDao;
import com.text.dao.impl.StudentDaoImpl;
import com.text.service.impl.StudentServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
String configLocation = "classpath:applicationContext.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);
System.out.println("==========IOC容器完成初始化==========");
String[] beanDefinitionNames = context.getBeanDefinitionNames();
for(String beanDefinitionName:beanDefinitionNames) {
System.out.println(beanDefinitionName);//studentDaoImpl studentServiceImpl
}
StudentDao studentDao1 = context.getBean("studentDaoImpl", StudentDao.class);
StudentServiceImpl studentService = context.getBean("studentServiceImpl", StudentServiceImpl.class);
StudentDao studentDao2 = studentService.getStudentDao();
System.out.println(studentDao1 == studentDao2);//false,studentDaoImpl scope=多例
StudentDaoImpl studentDao3 = (StudentDaoImpl)studentService.getStudentDao();
System.out.println(studentDao3.getUrl());//jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxx
}
}
特别说明:
@Resource 注解StudentServiceImpl 后,先从容器中找bean名称=studentDao的对象,没找到(系统中实例对象名称是studentDaoImpl)再通过类型StudentDao寻找,找到studentDaoImpl,注入studentServiceImpl对象的studentDao属性中,由于studentDao是私有属性,IOC容器会通过反射技术将studentDao改为puclic属性(修改modifier值),然后赋值,赋值后再次studentDao设置私有属性;此种方式和xml中的property的方式不同,property的方式是通过反射调用SetStudentDao方法