-
注意:
-
上述的2个注解并不是Spring提供的,JSR(JavaEE规范)520
-
再⼀次的验证,通过注解实现了接⼝的契约性
2. 注⼊相关注解
- ⽤户⾃定义类型 @Autowired
@Autowired细节
- Autowired注解基于类型进⾏注⼊ [推荐]
基于类型的注⼊:注⼊对象的类型,必须与⽬标成员变量类型相同或者是其⼦类
(实现类)
- Autowired Qualifier 基于名字进⾏注⼊ [了解]
基于名字的注⼊:注⼊对象的id值,必须与Qualifier注解中设置的名字相同
- Autowired注解放置位置
a) 放置在对应成员变量的set⽅法上
b) 直接把这个注解放置在成员变量之上,Spring通过反射直接对成员变量进⾏注⼊(赋值)[推荐]
- JavaEE规范中类似功能的注解
JSR250 @Resouce(name=“userDAOImpl”) 基于名字进⾏注⼊
@Autowired()
@Qualifier(“userDAOImpl”)
注意:如果在应⽤Resource注解时,名字没有配对成功,那么他会继续按照类型进⾏注⼊。
JSR330 @Inject 作⽤ @Autowired完全⼀致 基于类型进⾏注⼊ —》EJB3.0
javax.inject
javax.inject
1
-
JDK类型
-
@Value
- 设置xxx.properties
id = 10
name = achang
- Spring的⼯⼚读取这个配置⽂件
<context:property-placeholder location=“”/>
- 代码
属性 @Value(“${key}”)
- @PropertySource
- 作⽤:
⽤于替换Spring配置⽂件中的<context:property-placeholder location=“”/>标签
-
开发步骤
-
设置xxx.properties
id = 10
name = achang
-
应⽤@PropertySource
-
代码
属性 @Value()
-
@Value注解使⽤细节
-
@Value注解
不能应⽤在静态成员变量上
如果应⽤,赋值(注⼊)失败
@Value注解+Properties这种⽅式,不能注⼊集合类型
Spring提供新的配置形式 YAML YML (SpringBoot)
3. 注解扫描详解
<context:component-scan base-package=“com.achang”/>
当前包 及其 ⼦包
1. 排除⽅式
<context:component-scan base-package=“com.achang”>
<context:exclude-filter type=“” expression=“”/>
type:
assignable:排除特定的类型 不进⾏扫描
annotation:排除特定的注解 不进⾏扫描
aspectj:切⼊点表达式
包切⼊点: com.achang.bean…*
类切⼊点: *…User
regex:正则表达式
custom:⾃定义排除策略框架底层开发
</context:component-scan>
排除策略可以叠加使⽤
<context:component-scan base-package=“com.achang”>
<context:exclude-filter type=“assignable” expression=“com.achang.bean.User”/>
<context:exclude-filter type=“aspectj” expression=“com.achang.injection… *”/>
</context:component-scan>
2. 包含⽅式
<context:component-scan base-package=“com.achang” use-default-filters=“false”>
<context:include-filter type=“” expression=“”/>
</context:component-scan>
- use-default-filters=“false”
作⽤:让Spring默认的注解扫描⽅式 失效。
- <context:include-filter type=“” expression=“”/>
作⽤:指定扫描那些注解
type:assignable:排除特定的类型 不进⾏扫描
annotation:排除特定的注解 不进⾏扫描
aspectj:切⼊点表达式
包切⼊点: com.baizhiedu.bean…*
类切⼊点: *…User
regex:正则表达式
custom:⾃定义排除策略框架底层开发
包含的⽅式⽀持叠加
<context:component-scan base-package=“com.achang” use-default-filters=“false”>
<context:include-filter type=“annotation” expression=“org.springframework.stereotype.Repository”/>
<context:include-filter type=“annotation” expression=“org.springframework.stereotype.Service”/>
</context:component-scan>
4. 对于注解开发的思考
- 配置互通
//Spring注解配置 配置⽂件的配置 互通
@Repository
public class UserDAOImpl{
}
public class UserServiceImpl{
private UserDAO userDAO;
set/get
}
- 什么情况下使⽤注解 什么情况下使⽤配置⽂件
@Component 替换 <bean
基础注解(@Component @Autowired @Value) 程序员开发类型的配置
- 在程序员开发的类型上 可以加⼊对应注解 进⾏对象的创建
User UserService UserDAO UserAction
- 应⽤其他⾮程序员开发的类型时,还是需要使⽤<bean 进⾏配置的
后续使用@Configuration + @Bean
SqlSessionFactoryBean MapperScannerConfigure
5. SSM整合开发(半注解开发)
-
搭建开发环境
-
引⼊相关jar 【SSM POM】
-
引⼊相关配置⽂件
-
applicationContext.xml
-
struts.xml
-
log4.properties
-
XXXMapper.xml
-
初始化配置
-
Web.xml Spring (ContextLoaderListener)
-
Web.xml Struts Filter
-
编码
注解扫描
<context:component-scan base-package=“”/>
- DAO (Spring+Mybatis)
-
配置⽂件的配置
-
DataSource
-
SqlSessionFactory ----> SqlSessionFactoryBean
-
dataSource
-
typeAliasesPackage
-
mapperLocations
-
MapperScannerConfigur —> DAO接⼝实现类
-
编码
-
entity
-
table
-
DAO接⼝
-
实现Mapper⽂件
- Service
- 原始对象 —》 注⼊DAO
@Service —> @Autowired
-
额外功能 —》 DataSourceTransactionManager —> dataSource
-
切⼊点 + 事务属性
@Transactional(propagation,readOnly…)
- 组装切⾯
<tx:annotation-driven
- Controller (Spring+Struts2)
- @Controller
@Scope(“prototype”)
public class RegAction implements Action{
@Autowired
private UserService userServiceImpl;
}
- struts.xml
1. 配置Bean
Spring在3.x提供的新的注解,⽤于替换XML配置⽂件。
@Configuration
public class AppConfig{}
- 配置Bean在应⽤的过程中
替换了XML
具体什么内容呢?
- AnnotationConfigApplicationContext
- 创建⼯⼚代码
ApplicationContext ctx = new AnnotationConfigApplicationContext();
-
指定配置⽂件
-
指定配置类
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
- 指定配置类所在的路径
ApplicationContext ctx = new AnnotationConfigApplicationContext(“com.achang”);
-
配置Bean开发的细节分析
-
基于注解开发使⽤⽇志
不能集成Log4j
集成logback
- 引⼊相关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
- 引⼊logback配置⽂件 (logback.xml)
%d{yyyy-MM-dd HH:mm:ss.SSS}[%thread] %-5level %logger{50} - %msg%n
-
@Configuration注解的本质
-
本质:也是
@Component注解的衍⽣注解
-
可以应⽤<context:component-scan进⾏扫描
2. @Bean注解
@Bean注解在配置bean中进⾏使⽤,等同于XML配置⽂件中的<bean标签
1. @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;
}
- ⾃定义id值
@Bean(“id”)
- 控制对象创建次数
@Bean
@Scope(“singleton|prototype”) 默认值 singleton
2. @Bean注解的注⼊
- ⽤户⾃定义类型
@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;
}
- JDK类型注⼊的细节分析
如果直接在代码中进⾏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;
}
}
3. @ComponentScan注解
@ComponentScan注解在配置bean中进⾏使⽤,等同于XML配置⽂件
中的
⽬的:进⾏相关注解的扫描 (@Component @Value …@Autowired)
context:component-scan标签
1. 基本使⽤
@Configuration
@ComponentScan(basePackages = “com.achang.scan”)
public class AppConfig2 {
}
<context:component-scan base-package=“”/>
2. 排除、包含的使⽤
- 排除
<context:component-scan base-package=“com.achang”>
<context:exclude-filter type=“assignable” expression=“com.achang.bean.User”/>
</context:component-scan>
@ComponentScan(basePackages = “com.achang.scan”,excludeFilters ={@ComponentScan.Filter(type=FilterType.ANNOTATION,value={Service.class}),
@ComponentScan.Filter(type=FilterType.ASPECTJ,pattern = “*…User1”)})
排除方式:↓
type = FilterType.ANNOTATION value
.ASSIGNABLE_TYPE value
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
一线互联网大厂Java核心面试题库
正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-a4ubKPh6-1712530315226)]
[外链图片转存中…(img-ZWBzaKY2-1712530315226)]
[外链图片转存中…(img-DTeXPzmi-1712530315227)]
[外链图片转存中…(img-KTGRERki-1712530315227)]
[外链图片转存中…(img-LAqw5r82-1712530315227)]
[外链图片转存中…(img-H74Sz5CN-1712530315228)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-qc5rtPV4-1712530315228)]
一线互联网大厂Java核心面试题库
[外链图片转存中…(img-UqQCE7I2-1712530315228)]
正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算