Spring IoC 注解 总结
1. 简介
本文介绍了Spring的IoC通过注解的方式实现。
2. 具体步骤
用注解的方式向IoC声明Bean总共分为两步:
- 在对应的class前加上注解
- xml中添加扫描范围
2.1 在对应的class前加上注解:
@Component //默认id为commonComponent
public class CommonComponent {
}
@Component("myid") //指定id为myid,
public class CommonComponent {
}
@Controller //和@Component等效,用于Controller层,默认id为myController
public class MyController {
}
@Service //和@Component等效,用于Service层,默认id为myService
public class MyService {
}
@Repository //和@Component等效,用于Dao层,默认id为myDao
public class MyDao {
}
2.2 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-4.3.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 1.指定在哪里扫描包,包之间用逗号隔开-->
<context:component-scan base-package="com.jojo.ioc"/>
<!-- 2.指定在哪里扫描包,但也排除包-->
<context:component-scan base-package="com.jojo.ioc">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>
<!-- 3.指定在哪里扫描包,只包含指定包-->
<context:component-scan base-package="com.jojo.ioc" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
</beans>
2.3 在配置类中添加扫描范围
使用java配置类代替xml的配置工作
@ComponentScan("com.jojo.ioc_01")//扫描
@PropertySource(value = "classpath:jdbc.properties")
@Configuration
public class JavaConfiguration {
}
2.4 使用
下面介绍如何使用bean
//1.指定xml文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("xxx.xml");
//2.得到bean对象
UserController bean = applicationContext.getBean(UserController.class);
System.out.println("bean" + bean);
//3.关闭容器
applicationContext.close();
使用配置类的方式:
//方式1创建
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(JavaConfiguration.class);
//方式2创建
AnnotationConfigApplicationContext applicationContext1 =new AnnotationConfigApplicationContext();
applicationContext1.register(JavaConfiguration.class);
applicationContext1.refresh();
//2.获取Bean
StudentController bean = applicationContext.getBean(StudentController.class);
System.out.println(bean);
3. 周期方法
如果想在类初始化时和销毁时执行函数,可以执行的函数前加上注解即可。
@Component
public class MyClass {
@PostConstruct //初始化注解,以下函数在bean对象初始化时执行
public void init(){
System.out.println("MyClass.init");
}
@PreDestroy //销毁注解,以下函数在bean对象销毁时执行:单例模式会调用,多例不会调用
public void destroy(){
System.out.println("MyClass.destroy");
}
}
4. 指定为单例还是多例
可以通过注解指定Bean类为单例还是多例。
- 单例:多次创建对象指向同一个对象。
- 多例:每次创建对象都new新对象。
单例代码:
@Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)//单例模式
@Component
public class MyClass {
}
多例代码:
@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)//多例模式
@Component
public class MyClass {
}
5. 自动装配
如果在Bean类中要使用其他Bean类,可以使用注解来实现自动装配。
@Controller
public class MyController {
//自动装配注解
@Autowired //指定装配类为MyService的bean类
@Qualifier(value = "myServiceImpl")//如果有多个满足,则指定多个中的一个
private MyService myService;//对应类型的bean装配
}
也可使用Resource关键字:
import jakarta.annotation.Resource;
@Controller
public class MyController {
//自动装配注解
//@Resource 等同于@Autowired
@Resource(name = "myServiceImpl")//等同于@Autowired + @Qualifier(value = "myServiceImpl")
private MyService myService;//对应类型的bean装配
}
使用Resource注解的话,需要在xml中导入以下依赖:
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>2.1.1</version>
</dependency>