注解基础概念

1.什么是注解编程

指的是在类或者方法上加入特定的注解(@xxxx)完成特定的功能的开发。

  1. @Compoment
  2. public class xxx()

2.为什么要注解编程

1.注解开发方便
代码简介,开发速度大大提高
2.Spring开发潮流
spring2.x引入注解,spring3.x完善注解 s[ringboot普及、推广注解编程。

3.注解的作用

  • 替换XML这种配置形式,简化配置

image.png

  • 替换接口,实现调用双方的契约性
  • 通过注解的方式,在功能调用者和功能提供者之间达成契约,进而进行功能的调用。因为注解的应用的更为方便灵活,所以在现在的开发中,更推荐通过注解的方式完成。

image.png

4.Spring注解的发展历程

1.Spring 2.x:开始支持注解编程 @Component.@Service,@Scope
目的:提供的这些注解只是为了某些XML的配置,作为XML开发的有益补充。
2.Spring 3.x:@Configuration,@Bean…
目的:彻底替换XML,基于纯注解
3.Spring4.x:SpringBoot提倡使用注解进行开发
问题:Spring基于注解进行配置后,还能否解耦合吗?

  • 在Spring框架应用注解机,如果对注解配置的内容不满意,可以通过Spring配置文件覆盖。

    对象创建的相关注解

    搭建开发环境:让Spring框架在设置包及其子包中扫描对应的注解使其生效。

    1. <context:component-scan base-package="com.xiaohuang"/>

    @Component

    作用:替换原有的Spring配置文件中的标签
    image.png
    image.png

  • id属性:在@Compont中提供了默认的设置方式:首单词小写(User->user)

  • class属性:通过反射获取class的,反射可以知道类的路径

@Compoment细节:

  • 如何显示指定工厂创建对象的id值

image.png

  • Spring配置文件可以覆盖注解配置内容(相同的id和class

image.png
注:id、class值要和注解中配置的一样才会被覆盖,否则Spring会创建新的对象

@Repository、@Servicre.@Controller

@Repository、@Servicre.@Controllel都是@Compoment的衍生注解。
本质上这些衍生注解就是@Compoment,通过源码可以看到他们都使用了@Component;它们的存在是为了,更加准确的表达一个类型的作用

  1. @Repository
  2. public class UserDAO();
  3. @Service
  4. public class UserService();
  5. @Controller
  6. public class UserController();

注意:Spring整合Mybatis开发过程中,不使用@Repository.@Component.

@Scope:控制对象的创建次数

注意:不添加@Scope ,Spring提供默认Singleton
XML配置
image.png
注解:
image.png
image.png

@Lazy:延迟创建单例实例对象

作用:延迟创建单实例对象
注意:一旦使用@Lazy注解后,Spring会在使用这个对象的时候,才创建这个对象。
image.png
注解:
image.png

@PostConstruct,@PreDestory:声明周期注解

初始化相关方法:@PostConstruct

  1. InitializingBean
  2. <bean init-method=""/>

销毁方法:@PreDestory

  1. DisposableBean
  2. <bean destory=method=""/>

注入相关注解

用户自定义类型 @Autowired

image.png
image.png

  • @Autowired 注解基于类型进行注入(推荐)
  • 注入对象的类型,必须与成员变量的类型相同或者是子类(实现类)

    1. @Autowired
    2. private UserDap userDao;

    @Autowired、@Qualifier 注解联合实现 基于名字进行注入 [了解]

  • 注入对象的 id 值,必须与 @Qualifier 注解中设置的名字相同

    1. @Autowired
    2. @Qualifier("userDAOImpl")
    3. private UserDAO userDAO;

    @Autowired 注解放置位置:

  • 放置在对应成员变量的 set 方法上,调用 set 方法赋值(在 set 里写的代码会被执行)

  • 直接放置在成员变量上,Spring 通过反射直接对成员变量进行赋值 [推荐]

JavaEE 规范中类似功能的注解:

  • JSR250 提供的 @Resource(name=”xxx”)基于名字进行注入
    等价于 @Autowired 与 @Qualifier 联合实现的效果
    注意:@Resource 注解如果名字没有配对成功,会继续 按照类型进行注入
    1. @Resource(name="userDAOImpl")
    2. private UserDAO userDAO;

JDK 类型 @value、@PropertySource

方法一:@value 注解的基本使用:

  1. 1. 设置xxx.properties
  2. id = 10
  3. name = suns
  4. 2. Spring的工厂读取这个配置文件
  5. <context:property-placeholder location=""/>
  6. 3. 代码中进行注入
  7. 属性 @Value("${key}")

方法二:使用 @PropertySource 取代 xml配置:

  1. 1. 设置xxx.properties
  2. id = 10
  3. name = suns
  4. 2. 在实体类上应用@PropertySource("classpath:/xx.properties")
  5. 3. 代码
  6. 属性 @Value("${key}")

@value 注解使用细节:

  • @Value 注解不能应用在静态成员变量上,如果使用,获取的值为 null
  • @Value 注解 + Properties 这种方式,不能注入集合类型
    Spring 提供新的配置形式 YAML(YML) (更多的用于SpringBoot中

    注解扫描 - component-scan

    这样配置,会扫描当前包及其子包 :
    1. <context:component-scan base-package="com.xiaoquan"/>

    排除方式:设置不扫描哪些注解

    1. <context:component-scan base-package="com.xiaoquan">
    2. <context:exclude-filter type="" expression=""/>
    3. </context:component-scan>
    type=”xxx”,xxx 有以下几个可选项:
    assignable:排除特定的类型
    annotation:排除特定的注解
    aspectj:切入点表达式,比较常用
    包切入点: com.yusael.bean..
    类切入点:
    ..User
    regex:正则表达式,不常用,与切入点类似
    custom:自定义排除策略,常用于框架底层开发(在 SpringBoot 源码中大量使用
    排除策略可以叠加使用:
    ```java
  1. <a name="YiosO"></a>
  2. ## 包含方式:设置扫描哪些注解
  3. ```java
  4. <context:component-scan base-package="com.xiaoquan" use-default-filters="false">
  5. <context:include-filter type="" expression=""/>
  6. </context:component-scan>

与排除方式使用的区别:

  1. use-default-filters="false" Spring 默认的注解扫描方式失效<br /> <context:include-filter type="" expression=""/> 用于指定扫描哪些注解<br /> type="xxx" 与排除方式完全一样,可以参考上面

包含策略也可以叠加使用:

  1. <context:component-scan base-package="com.xiaoquan" use-default-filters="false">
  2. <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
  3. <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
  4. </context:component-scan>

对于注解开发的思考

注解与xml配置互通

Spring 通过注解配置,与通过xml文件进行配置是互通的。

  1. // 通过注解配置UserDAOImpl
  2. @Repository
  3. public class UserDAOImpl{
  4. }
  5. public class UserServiceImpl{
  6. private UserDAO userDAO;
  7. set
  8. get
  9. }
  10. // 通过xml配置创建userDAO对象
  11. <bean id="userService" class="com.baizhiedu.UserServiceImpl">
  12. <property name="userDAO" ref="userDAOImpl"/>
  13. </bean>

什么情况下使用注解,什么情况下使用配置文件

基础注解(@Component、@Autowired、@Value)用于程序员开发类型的配置:
在程序员开发的类型上,可以加入对应注解进行对象的创建
User、UserService、UserDAO、UserAction… 这些类都很适合用注解
应用其他非程序员开发的类型时(框架自带的类),需要使用标签进行配置
SqlSessionFactoryBean、MapperScannerConfigure Spring 创建的类,无法使用注解[

](https://blog.csdn.net/weixin_43734095/article/details/106579553)