Spring入门教程-注解开发
## 注解到底是什么?
注解:注解只不过是一个标记,存储了少量的内容信息,具体功能是由具体的框架实现.注解启动时使用注解的形式替代xml配置,将繁杂的spring配置文件从工程中彻底消除掉,简化书写.
程序运行流程
- 加载配置文件
- 添加bean到容器中
- 解析bean标签
- 解析相关注解
- @Bean
- bean加载完成即可运行业务程序
启动注解功能,加载类中配置的注解项
<context:component-scan base-package="packageName"/>
spring配置bean的方式
-
配置文件方式 bean标签配置
-
注解配置,加载类上(注意只写注解不会生效,一定需要扫描对应的包)
- 类注解:@Component、@Controller、@Service、@Repository(“userDao”)
- 注入bean,写在类上面将一个类的实列加入spring容器
- value(默认):定义bean的访问id
- 类注解:@Scope(value默认单例)
- singleton单例
- prototype多例
- 方法注解,限定bean的生命周期:@PostContructor、@PreDestory
- 类注解:@Component、@Controller、@Service、@Repository(“userDao”)
-
加载第三方资源
名称:@bean
类型:方法注解
@Component public class JdbcConfig { @Bean("dataSource") public DataSource getDataSource() { DataSource dataSource = new DruidDataSource(); return dataSource; } }
-
bean的非引用类型属性注入
名称:@Value
类型:属性注解、方法注解
@Value("${jdbc.username}") private String username;
-
bean的引用类型属性注入
名称:@Autowired、@Qualifier
类型:属性注解、方法注解。
说明:@Autowired默认按类型装配,指定@Qualifier后可以指定自动装配的bean的id
@Autowired(required = false) @Qualifier("userDao") private UserDao userDao;
名称:@Primary
类型:类注解
说明: @Autowired默认按类型装配,当出现相同类型的bean,使用@Primary提高按类型自动装配的优先级,多个@Primary 会导致优先级设置无效
@Primary public class ClassName{}
名称:@Inject、@Named、@Resource
说明:
◆ @Inject与@Named是JSR330规范中的注解,功能与@Autowired和@Qualifier完全相同,适用于不同架构场景
◆ @Resource是JSR250规范中的注解,可以简化书写格式,
相关属性
- name:设置注入的bean的id
2. type:设置注入的bean的类型,接收的参数为Class类型
- name:设置注入的bean的id
-
加载properties文件
名称:@PropertySource
类型:类注解
说明:
◆ 不支持*通配格式,一旦加载,所有spring控制的bean中均可使用对应属性值
◆ value(默认):设置加载的properties文件名
◆ ignoreResourceNotFound:如果资源未找到,是否忽略,默认为false
@PropertySource(value = "classpath:filename.properties") public class ClassName { @Value("${propertiesAttributeName}") private String attributeName; }
使用配置类替换配置文件(纯注解格式)
-
类注解
- @Configuration
- @ComponentScn
-
具体使用
-
创建配置类
@Configuration //标记当前类是一个配置类 @ComponentScan("com") public class EntryConfiguration { }
-
-
修改容器实现类
public class DemoAnnotation { public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(EntryConfiguration.class); UserService bean = ctx.getBean(UserService.class); System.out.println(bean); } }
-
第三方bean配置与管理
名称:@Import
类型:类注解
@Configuration @Import(OtherClassName.class) public class ClassName {}
说明:
-
import注解直接写一个class名就可以直接注入一个bean到spring容器中
-
@Import注解在同一个类上,仅允许添加一次,如果需要导入多个,使用数组的形式进行设定
-
在被导入的类中可以继续使用@Import导入其他资源(了解)
-
@Bean所在的类可以使用导入的形式进入spring容器,无需声明为bean
依赖加载
-
名称:@Import
类型:类注解、方法注解
@DependsOn("beanId") public class ClassName { }
说明:
◆ 配置在方法上,使@DependsOn指定的bean优先于@Bean配置的bean进行加载
◆ 配置在类上,使@DependsOn指定的bean优先于当前类中所有@Bean配置的bean进行加载
◆ 配置在类上,使@DependsOn指定的bean优先于@Component等配置的bean进行加载
相关属性
◆ value(默认):设置当前bean所依赖的bean的id
-
@Lazy, 延迟加载
名称:@Lazy
类型:类注解、方法注解
@Lazy public class ClassName { }
-
@Order, 有多个配置类的时候可以指定顺序
名称:@Order
类型:配置类注解
@Order(1) public class SpringConfigClassName { }
spring整合mybatis从0开始
分析
- 业务类使用注解形式声明bean,属性采用注解注入
- 建立独立的配置管理类,分类管理外部资源,根据功能进行分类,并提供对应的方法获取bean
- 使用注解形式启动bean扫描,加载所有注解配置的资源(bean)
- 使用AnnotationConfigApplicationContext对象加载所有的启动配置类,内部使用导入方式进行关联
步骤
- 修改mybatis外部配置文件格式为注解格式
- 业务类使用@Component声明bean,使用@Autowired注入对象
- 建立配置文件JDBCConfig与MyBatisConfig类,并将其导入到核心配置类SpringConfig
- 开启注解扫描
- 使用AnnotationConfigApplicationContext对象加载配置项
注解整合Junit
-
导入Spring整合Junit坐标
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.1.9.RELEASE</version> </dependency>
-
Spring整合Junit测试用例注解格式
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SpringConfig.class) public class UserServiceTest { }