回答

收藏

spring系列 注解开发(spring常用注解)

知识点 知识点 22 人阅读 | 0 人回复 | 2023-01-19

帖子摘要:Component bean的类上加注解Componentvalue是否设置值取决于用id获取还是根据class名获取id获取就要给一个value对应id值。 xml中要先指定命名空间在接compon......  n: L) V5 Y& `# e7 n( q

  l1 A3 a0 v* v( a+ L大家好,欢迎来到Java吧(www.java8.com),交流、学习Java技术、获取Java资源无任何套路,今天说一说:“spring系列 注解开发”
0 X1 v. _) G- G% N
: k3 s" G  V+ o
7 O- ^2 ?* b' @9 P
        
0 q6 X( Z/ k+ v0 R                  @/ b" H! i3 P. [
                    @Component * E! w# k  D6 p  l- H5 W0 i3 u
bean的类上加注解@Componentvalue是否设置值取决于用id获取还是根据class名获取id获取就要给一个value对应id值。
$ t' }9 t5 m- r# \/ O# w3 |3 M9 i7 D
5 b! H( \9 G! f1 B7 Vxml中要先指定命名空间在接component-scan开启包扫描后面接要扫描那个路径下的包$ q1 Y1 W$ O9 e

* l) o9 r7 e2 @8 @; D6 i8 \1 j ! ^8 v, M9 f8 c" I$ z, L  a
( U! g6 j+ I1 Z. i2 m

: v+ c  t) V* w* G
" ^; z6 W+ M2 q     - t6 ^+ n, Y! z

; ?8 t+ f! l- T, w/ h
4 U8 |1 ~0 w  l& [7 w' ~) X
* I  i& U2 E' S! W
& x2 p6 V7 L  g7 n
Spring提供@Component注解的三个衍生注解
% V/ r, |2 q$ J3 Y0 V ) P- ]1 Z3 U9 a, s2 Q
@Controller用于表现层bean定义
( a0 @: M" I' R( X6 ]" ^0 l " X7 _  b9 l& l) v% x3 y" Z: R$ m
@Service用于业务层bean定义9 y3 F- X# R* l
/ F2 e; R. y( Y. n  r
@Repository用于数据层bean定义
0 f( }7 w- m7 C- {, }: A1 P 2 t' X0 o7 B, I- f9 g) z' a, w& |6 g
@Configuration
3 h# q: [3 _: ~1 A* ?0 g( f6 A9 t$ d用于设定当前类为配置类/ c1 T7 v0 ^0 a4 Z  o/ h6 ~7 F( J( O) A

( L. Y/ l1 ~% Q  V6 H作用是spring对xml结构的简化xml结构就是下面这块# T1 E, ^# ^8 x$ r

$ u! X) u- b0 Z + D; R4 H0 h0 X% v' o% C6 N
: s* ~- O) A- s/ @: S0 Z
. ^5 U, t/ _5 n! F. I

. ~! t5 Y* T; a# ~  6 ~4 P: |( u' I6 [3 h$ Y, O

0 y$ n  }2 Z4 w& \( y$ Z
- _/ ]$ L% \8 i# c5 n

. G5 P* r' d3 n! j/ l0 Z@ComponentScan # c3 t9 f0 @9 R" l
用于设定扫描路径此注解只能添加一次多个数据用数组格式
/ i- F  m- o) k7 s, h/ K
! M9 f/ X7 p- f3 ?6 _! K& ]+ T, M也就是简化xml中的
) a/ [$ W' @7 U  ] & a+ U% K* W6 y. x" [. G
8 L3 L9 ?1 f' H6 `# T- l- ~' }; B! T

* [) w2 ~6 q3 N6 R9 s) x 1 H% U$ V4 W9 y' w) j

+ y* X! D4 V! Vbean模式@Scope("singleton")
& s( D7 Q. z7 ybean生命周期@PostConstruct、@PreDestroy   E2 N$ h/ Y, \5 L4 z. s

0 s9 m% r2 W# i- D4 t3 t+ X9 w( v public class BookDaoImpl implements BookDao {    , f+ M# e+ F# h5 R5 d5 T% }7 G
2 p: x) o/ l# x! E4 W
         @PostConstruct   
, r( ?. n; J( J
  I: ]/ r! r0 S- d         public void init(){        ( f; R. e6 X: ?

' J$ n- z" P6 T7 r& l                 System.out.println("book init ...");    ) h" n3 B6 F5 Q1 ?0 s4 B
2 b( R( O. [; S1 y( i3 }3 @5 Y
         }    : L4 N% V/ N; F6 r0 \' t  M. ]
' g$ M* [& y8 e$ R: _
         @PreDestroy    , O! k3 R' f: E, F+ W

8 [8 J# }/ |9 B3 m! U0 M         public void destroy(){        
# V0 W5 [9 V7 Q: R. u+ }+ _
# X: R2 X3 o. m* X                 System.out.println("book destory ...");    ; D6 Y( k# i6 a4 M' f+ k
" D9 ^# U( O- O
         }
% @" Y  S2 ^" E! d3 L, {3 D. g ) s7 }9 [; l  Q  s9 ^' n( h5 ?; w
}# z5 f6 a5 W* J! F$ P
: @6 r5 k2 E8 g  v

4 p% H4 I4 r  P; Q自动装配@Autowired、@Qualifier
0 H. Y& ^. s$ d' ?# F8 i6 R自动装配默认使用无参构造方法创建对象并基于反射创建对象因此无需提供set方法之前的byType模式需要set方法是因为有可能方法定义了private框架考虑的是不能越俎代庖现在为了方便都可以反射了。7 K' |, Z! |1 z) H

1 Z# R" I+ w  c' i@Autowired是基于 byType模式的需要bean唯一当有多个相同类型的bean需要初始化时会报错为了解决这个问题可以采用下面的@Qualifier注解bean的类上里面配上bean的id@Repository("bookDao")@Qualifier配上对应的id' S5 {, h( p/ k$ c. b

9 y/ M1 B$ r4 {) Y! h@Qualifier不能单独使用要依赖于@Autowired没有的话没有注入调用会报空指针。
, x8 ~8 N( K; R
; r/ j+ A- m5 I5 W0 D+ o7 H值注入@Value
! z( `3 U0 X* ]9 E. o" }4 K读取配置文件@PropertySource 5 S# Z- B( _3 O8 I9 Z1 h
多个路径书写为字符串数组格式这里不支持使用通配符会将*视为文件名的一部分lasspath:可加可不加。6 l( _- Z) b; n% R1 h* U. h

( F. c1 q; ^8 w: N  A) A引入起来配置类@Import ( m! M& C! H+ Y# d
配置信息可能会有很多所以我们用一个配置类专门管理用@Import引入其他配置类。
# I$ D! }2 h6 d. d
. h  g; \$ I, n! l! Q7 H' D注入返回方法对象@Bean
8 I9 f2 K3 K$ N7 g5 e表示当前方法的返回值是一个bean。
( b4 l7 R+ n+ n. U/ \ 7 p' n6 s/ B) o5 Q, F% v; U
@Bean修饰的方法形参根据类型自动装配
; V  m# k' n) y$ w ) p% j, o/ o/ ^2 `8 \0 a% j1 w6 u
注解的综合用法 " W  ~& Y, d; ?
定义bean: c; `7 ?7 r- J/ D! r

; h2 ?2 {9 }1 N+ p5 W
7 F; p2 A  r' {6 `* A) c; y+ o. N @Repository- e. I3 W& r, V1 j
. M' M9 e% J3 u" P
//@Component("bookDao")
( N' @' G3 z: _- L1 U$ g6 Y
0 K3 T9 }' `* k% Q @Scope("singleton")
6 H' \- d. C1 i* ~  j! G5 U) I
' r9 b- _7 A2 d( b! W public class BookDaoImpl implements BookDao {    8 I8 }0 K. R* C, z8 y# \; f
1 m, U, F& I6 ?2 _  b4 [
         @Value("${name}")   4 J! r1 t. R5 e/ ]
/ h+ R- p+ ]' A3 A0 W9 J! i
         private String connectionNum;$ d$ v1 t; y$ {

, k6 ^. j6 P" b8 c# s  * f0 N/ h/ z4 _8 ~# q
         @PostConstruct   
8 Z+ q4 e. a6 b
+ `) \3 D; T- }1 s: J' K2 U         public void init(){        * J1 w% i3 @3 u4 b: ?' p
% k0 {# e5 z. a* x8 e* z  k5 S4 Y4 I  B5 o
                 System.out.println("book init ...");    6 M, d7 g( e6 N& Q6 {, w
) q* Y/ L5 z5 c' {9 u
         }    " L+ r6 ^! b' h
3 m3 X$ U! p8 x! L6 R+ a
         @PreDestroy   
  b+ Q) S6 ^7 l" ]  Q7 L4 k
# L- c, X$ g# ^9 s5 _" Q# c! T         public void destroy(){        + S5 W+ ^; L  g* ^9 U  {1 b' E

* I5 D% I0 B4 o& l- U! }                 System.out.println("book destory ...");    - ~+ c; |, Q: q( ?) n- B
! S7 r. a; G* S+ z: j3 z
         }/ F6 _% o% X+ I7 D* S7 {

5 `9 \: X( L; H( p }
6 J4 c- R6 X* F0 H7 X2 U- z- H
9 n$ e1 C; b  d+ T  z1 ?& T

1 g: m( y% k5 g注入* a$ Q9 @9 a1 y

" A/ A1 p0 p6 E ' `) _" r+ `4 Z) K, n& S$ i
@Service
) E+ c9 X' T) D) W( t
$ ^; O7 S4 ~7 o public class BookServiceImpl implements BookService {    5 ^& C& O! F+ L( \% s4 T

+ J1 e# ~6 `, `$ N7 O" p         @Autowired   + D9 w/ B2 d. H5 ?* e
- ]0 n1 R  J% g: a$ ~1 T3 W
         //@Qualifier("bookDao1")
( ]% u4 U2 f, P" ]: S$ ]; \5 o 4 z+ x" a+ {( S
         private BookDao bookDao;  ' w. X/ [1 e0 w6 T% }
& l0 l1 @2 t) O! M
  
7 w! |1 M0 v! Q, r3 j2 o' n. ?         public void setBookDao(BookDao bookDao) {        . W2 G' S& Y2 X* f/ ~) A  ]$ e

$ p' i- V; X3 ^! [/ [% G' L                 this.bookDao = bookDao;    % e& L  i% ], D- @" }# Y5 w

: l- S9 L/ v9 W6 W         }    ) l& [5 {7 h  ]1 A! ^( I

( P, r, A! D) h         public void save() {        
# f8 s0 ?& U7 j% _! W) A $ g7 @2 e# g) X7 s# X
                 System.out.println("book service save ...");        
- {1 a2 X$ e/ k2 f
& S1 V8 G+ q6 d( n                 bookDao.save();    : o) d/ |! [6 z

  O6 C, u$ f& ]3 H; o% H         }
9 l0 J" I2 t" V # I+ K; c8 w# p5 }# J# M
}* q* U8 i  A  S( T, n

1 V* T# \. [, z. }2 A

; P/ y+ H5 T/ b' r) q0 ?4 I@Configuration声明当前类为Spring配置类
( P/ S+ ?/ @4 J9 J+ ]: a3 v0 d% m
/ d& j1 i6 K0 u5 |! \ $ R9 k8 k; M3 n" a1 g2 I2 Z% ^
@Configuration
* |4 U: s7 _: k* p: c! j9 R+ P //设置bean扫描路径多个路径书写为字符串数组格式
  A# R" g. q0 C" k @ComponentScan({"com.xxz.service","com.xxz.dao"})6 ^" Z3 T: O7 V. x0 j8 d" u) c

8 y# _1 m- k. |$ Y. x% `( d @PropertySource("classpath:jdbc.properties")3 \( T$ b- v( X1 I, [, d

: ?4 s+ J) E8 j2 U# ] @Import({JdbcConfig.class})
0 j4 o& J* _7 ^: f( G; r' D$ O$ | public class SpringConfig {
; g* p& E1 T3 t" N }
) f' M$ V# }! g! B7 c+ c
6 \1 T( m  V+ a7 }

# w. h; G6 P1 C4 D5 R- @' o% T9 v : Q8 u1 i: t/ B  a* F
8 W0 I. T1 D6 j+ F9 m( P1 M4 e7 u
public class JdbcConfig {6 D7 Z0 o: h: x
     //1.定义一个方法获得要管理的对象
. R7 h5 @3 ^) f8 Q     @Value("com.mysql.jdbc.Driver")1 r# k  O6 j" i* C) I+ X
     private String driver;. O. S# Y2 u5 G+ _9 k4 l* f2 R+ U
     @Value("jdbc:mysql://localhost:3306/spring_db")) ~" Q) N: c! l% c0 v- v
     private String url;
* K; O1 T+ I8 F# `3 N  ^     @Value("root")
! M& Y' _* E1 X& m     private String userName;6 r" Y7 m" T" A9 R% f8 i' G& l
     @Value("root")1 `; M& J9 i' ~! e3 b
     private String password;1 f/ ^2 V# A' B1 x0 T1 f
/ M! ~: \! P# s0 _7 l4 S
  
0 I- `- X. y, s) A/ M3 b8 N     //当有依赖对象注入需求时由于总配置类开启了包扫描所以这里只需要给BookDao bookDao框架就帮我们自动注入了。5 D* A- f7 ^9 W$ X) u6 U
     @Bean# y, l6 `9 w6 a/ |* S
     public DataSource dataSource(BookDao bookDao){
3 l5 x. M! }) ~         System.out.println(bookDao);, k8 x6 V1 U0 ~) X! `
         DruidDataSource ds = new DruidDataSource();& X- f5 |3 n! T
         ds.setDriverClassName(driver);7 b  f8 t9 x; O+ F1 r& }& H* k
         ds.setUrl(url);; ~1 c2 n5 n/ x' Y! F
         ds.setUsername(userName);
$ R4 D! W( Q: B         ds.setPassword(password);* [, T7 b: @) F7 V  Y; ?+ J
         return ds;* [$ }4 ~; N/ G8 u/ j
     }- [; V3 x/ ^; @
}
4 A- I) u$ k, r7 \% x4 M% x0 i 5 W: V2 V3 b. F7 c. J& ^* l3 J3 a
. R* a% [7 ^* ~' A( C2 f$ {
jdbc.properties
4 |- [/ w  U1 q$ N, Z* _
# U6 M: k' p. f1 j  K 5 f; O4 E/ I& e1 _6 Y: w+ N
name=888
7 H  ]# j4 ?3 U4 U, G& Z % h+ f% d# `' [# c4 ~' x4 R# u
7 p  B2 D( e( z3 m" ]  ?
启动类中采用注解容器
- W+ x6 Z3 {4 L. Q8 y9 B) v2 } 1 g6 P8 ~1 }$ D3 _; G4 {; B
$ T! d8 |2 n% `' W* n: g
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);9 p$ b9 n: L$ y" O

+ X+ P$ V2 e8 f$ Q DataSource dataSource = ctx.getBean(DataSource.class);2 F! \& \, U9 k! u- {
System.out.println(dataSource);# [; d7 R1 E; q( X, H

" }: N* c9 @0 [$ t

2 S! D# M6 h) b: n; t' o
$ X0 H1 M9 c9 G3 y; q
$ G, h% E) d4 A6 C" v( H) ? ! n! Q3 `6 o4 b: A* p& Y0 G

4 E/ ]+ b5 _& m' W
; a1 |- X* E) D* e7 b2 R; z" e: @& u6 [
本文来源csdn,由Java吧转载发布,观点不代表Java吧的立场,转载请标明来源出处:https://www.java8.com
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则