方法1: 指定配置bean的Class
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
方法2: 指定配置bean所在的路径(某个包及其子包)
ApplicationContext ctx = new AnnotationConfigApplicationContext(“com.yusael”);
@Configuration
注解的本质:查看源码可知,它也是@Component
注解的衍生注解
因此我们可以用
<context:component-scan
进行扫描,但我们不会这么做,因为注解就是为了取代 xml。
1、引入相关 jar:
org.slf4j
slf4j-api
1.7.25
org.slf4j
jcl-over-slf4j
1.7.25
ch.qos.logback
logback-classic
1.2.3
ch.qos.logback
logback-core
1.2.3
org.logback-extensions
logback-ext-spring
0.1.4
2、引入 logback 配置文件:logback.xml
<?xml version="1.0" encoding="UTF-8"?>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
===========================================================================
@Bean
注解在配置 bean 中进行使用,等同于 XML 配置文件中的 <bean
标签
对象的创建:
简单对象:直接能够通过 new 方式创建的对象
- User、UserService、UserDAO
复杂对象:不能通过 new 的方式直接创建的对象
- Connection、SqlSessionFactory
@Bean
注解创建复杂对象的注意事项:遗留系统整合
@Bean
public Connection conn1() {
Connection conn = null;
try {
ConnectionFactoryBean factoryBean = new ConnectionFactoryBean();
conn = factoryBean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
@Bean
注解创建对象,自定义 id 值
@Bean(“id”)
@Bean
注解创建对象,控制对象创建次数
@Bean
@Scope(“singleton|prototype”) // 默认值 singleton
用户自定义类型:
@Bean
public UserDAO userDAO() {
return new UserDAOImpl();
}
@Bean
public UserService userService(UserDAO userDAO) {
UserServiceImpl userService = new UserServiceImpl();
userService.setUserDAO(userDAO);
return userService;
//简化写法
@Bean
public UserService userService() {
UserServiceImpl userService = new UserServiceImpl();
userService.setUserDAO(userDAO());
return userService;
}
JDK类型:
@Bean
public Customer customer() {
Customer customer = new Customer();
customer.setId(1);
customer.setName(“xiaohei”);
return customer;
}
如果直接在代码中进行 set 方法的调用,会存在耦合的问题,通过配置文件解决:
@Configuration
@PropertySource(“classpath:/init.properties”)
public class AppConfig1 {
@Value(“${id}”)
private Integer id;
@Value(“${name}”)
private String name;
@Bean
public Customer customer() {
Customer customer = new Customer();
customer.setId(id);
customer.setName(name);
return customer;
}
}
====================================================================================
@ComponentScan
注解在配置 bean 中进行使用,等同于 XML 配置文件中的 <context:component-scan>
标签
目的:进行相关注解的扫描(@Component
、@Value
、@Autowired
…)
基本使用:
- XML 方式:
<context:component-scan base-package=“com.yusael.scan”/>
- 注解方式:
@Configuration
@ComponentScan(basePackages = “com.yusael.scan”)
public class AppConfig2 {
}
排除策略的的使用:
- XML 方式:
<context:component-scan base-package=“com.yusael”>
<context:exclude-filter type=“assignable” expression=“com.yusael.bean.User”/>
</context:component-scan>
- 注解方式:
排除特定的注解:type = FilterType.ANNOTATION, value={}
排除特定的类型:type = FilterType.ASSIGNABLE_TYPE , value={]
切入点表达式:type = FilterType.ASPECTJ, pattern=""
正则表达式:type = FilterType.REGEX, pattern=""
自定义排除策略:type = FilterType.CUSTOM, pattern=""
@ComponentScan(basePackages = “com.yusael.scan”,
excludeFilters = {@ComponentScan.Filter(type= FilterType.ANNOTATION, value={Service.class}),
@ComponentScan.Filter(type= FilterType.ASPECTJ, pattern = “*…User1”)})
包含策略的使用:
- XML 方式:
<context:component-scan base-package=“com.yusael” use-default-filters=“false”>
<context:include-filter type=“” expression=“”/>
</context:component-scan>
- 注解方式:参数与排除策略中一样
@ComponentScan(basePackages = “com.yusaael.scan”,
useDefaultFilters = false,
includeFilters = {@ComponentScan.Filter(type= FilterType.ANNOTATION,value={Service.class})})
=====================================================================================
多种配置方式的应用场景:
配置优先级:@Component
及其衍生注解 < @Bean
< 配置文件<bean>
标签
-
优先级高的配置,会覆盖优先级低配置
-
配置覆盖:id 值需要保持一致
@Component
public class User{
}
@Bean
public User user(){
return new User();
}
通过配置优先级,可以解决基于注解进行配置的耦合问题:
@Configuration
//@ImportResource(“applicationContext.xml”)
public class AppConfig4 {
@Bean
public UserDAO userDAO() {
return new UserDAOImpl();
}
}
@Configuration
@ImportResource(“applicationContext.xml”)
public class AppConfig5{
}
applicationContext.xml
===========================================================================
为什么会有多个配置信息?
- 拆分多个配置 bean 的开发,是一种模块化开发的形式,也体现了面向对象各司其职的设计思想
多配置信息整合的方式:
-
多个配置 Bean 的整合
-
配置 Bean 与
@Component
相关注解的整合 -
配置 Bean 与 SpringXML 配置文件的整合
整合多种配置需要关注那些要点:
-
如何使多配置的信息汇总成一个整体
-
如何实现跨配置的注入
多配置的信息汇总:
- 基于
basePackegs
包扫描的方式整合多个配置 Bean
@Import
在一个配置 Bean 中引入另一个配置 Bean
- 在工厂创建时,指定多个配置 Bean 的 Class 对象【了解】
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig1.class, AppConfig2.class);
跨配置进行注入:
- 在应用配置 Bean 的过程中,不管使用哪种方式进行配置信息的汇总,其操作方式都是通过成员变量加入
@Autowired
注解完成。。
@Configuration
@Import(AppConfig2.class)
public class AppConfig1 {
@Autowired
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/18d32e2c38db923f08595b1eda964f8d.jpeg)
最后
分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。
这些面试题相对应的技术点:
- JVM
- MySQL
- Mybatis
- MongoDB
- Redis
- Spring
- Spring boot
- Spring cloud
- Kafka
- RabbitMQ
- Nginx
- …
大类就是:
- Java基础
- 数据结构与算法
- 并发编程
- 数据库
- 设计模式
- 微服务
- 消息中间件
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
- MySQL
- Mybatis
- MongoDB
- Redis
- Spring
- Spring boot
- Spring cloud
- Kafka
- RabbitMQ
- Nginx
- …
大类就是:
- Java基础
- 数据结构与算法
- 并发编程
- 数据库
- 设计模式
- 微服务
- 消息中间件
[外链图片转存中…(img-90ZN00z0-1712256027044)]
[外链图片转存中…(img-pdYXM3xz-1712256027044)]
[外链图片转存中…(img-6i5c3RjA-1712256027045)]
[外链图片转存中…(img-8n0i600t-1712256027045)]
[外链图片转存中…(img-NU6ykLTW-1712256027045)]
[外链图片转存中…(img-BpZSjLOf-1712256027046)]
[外链图片转存中…(img-SJuJaXHL-1712256027046)]
[外链图片转存中…(img-WoGRXK9m-1712256027047)]
[外链图片转存中…(img-XdBlcGfi-1712256027047)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!