写点什么

【Spring 基础注解】对象创建相关注解,java 开发实战经典答案百度云

  • 2021 年 11 月 10 日
  • 本文字数:2321 字

    阅读完需:约 8 分钟

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


@Component




作用:替换原有 Spring 配置文件中的 <bean> 标签


  • id 属性:在 @Component 中提供了默认的设置方式:首单词首字母小写(UserDAO --> userDAO)

  • class 属性:通过反射获得的 class 的内容



@Component 细节:


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


@Component("u")


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


applicationContext.xml


<bean id="user" class="com.yusael.bean.User">


<property name="id" value="10"/>


</bean>


id 值、class 值 要和 注解 中配置的一样才会覆盖,


否则 Spring 会创建新的对象。


@Repository、@Service、@Contoller




@Repository@Service@Controller 都是 @Component衍生注解


本质上这些衍生注解就是 @Component,通过源码可以看见他们都使用了 @Component


它们的存在是为了:更加准确的表达一个类型的作用


@Repository


public class UserDAO {}


@Service


public class UserService {}


@Controller


public class UserController {}


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


@Scope:控制对象创建次数




作用:控制简单对象创建次数


注意:不添加 @Scope,Spring 提供默认值 singleton


XML 配置:


<bean id="customer" class="com.yusael.Customer" scope="singleton | prototype"/>


注解:


// 创建单例对象


@Component


@Scope("singleton")


public class Customer {}


// 创建多例对象


@Component


@Scope("prototype")


public class Customer {}


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




作用:延迟创建单实例对象


注意:一旦使用 @Lazy 注解后,Spring 会在使用这个对象的时候,才创建这个对象。


XML 配置:


<bean id="account" class="com.yusael.Account" lazy="true"/>


注解:


@Component


@Lazy


public class Account {


public Account() {


System.out.println("Account.Account");


}


}


@PostConstruct、@PreDestroy:生命周期注解




初始化相关方法: @PostConstruct


InitializingBean


<bean init-method=""/>


销毁方法:@PreDestory


DisposableBean


<bean destory-method=""/>


注意:


  • 上述的两个注解并不是 Spring 提供的,由 JSR(JavaEE 规范)520 提供

  • 再次验证,通过注解实现了接口的契约性


注入相关注解


=========================================================================


用户自定义类型 @Autowired





@Autowired 注解 基于类型进行注入 [推荐]:


  • 注入对象的类型,必须与目标成员变量类型相同或者是其子类(实现类)


@Autowired


private UserDAO userDAO;


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


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


@Autowired


@Qualifier("userDAOImpl")


private UserDAO userDAO;


@Autowired 注解放置位置:


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

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


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


  • JSR250 提供的 @Resource(name="xxx") 基于名字进行注入


等价于 @Autowired@Qualifier 联合实现的效果


注意:@Resource 注解如果名字没有配对成功,会继续 按照类型进行注入


@Resource(name="userDAOImpl")


private UserDAO userDAO;


  • JSR330 提供的 @Injection 作用与 @Autowired 完全一样,一般用在 EJB3.0 中


JDK 类型 @value、@PropertySource




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


  1. 设置 xxx.properties


id = 10


name = suns


  1. Spring 的工厂读取这个配置文件


<context:property-placeholder location=""/>


  1. 代码中进行注入


属性 @Value("${key}")


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


  1. 设置 xxx.properties


id = 10


name = suns


  1. 在实体类上应用 @PropertySource("classpath:/xx.properties")

  2. 代码


属性 @Value("${key}")


@value 注解使用细节:


  • @Value 注解不能应用在静态成员变量上,如果使用,获取的值为 null

  • @Value 注解 + Properties 这种方式,不能注入集合类型


Spring 提供新的配置形式 YAML(YML) (更多的用于 SpringBoot 中)


注解扫描详解


=========================================================================


这样配置,会扫描当前包及其子包 :


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


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




<context:component-scan base-package="com.yusael">


<context:exclude-filter type="" expression=""/>


</context:component-scan>


type="xxx"xxx 有以下几个可选项:


  • assignable:排除特定的类型

  • annotation:排除特定的注解


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


aspectj:切入点表达式,比较常用


包切入点: com.yusael.bean..*


类切入点: *..User


  • regex:正则表达式,不常用,与切入点类似

  • custom:自定义排除策略,常用于框架底层开发(在 SpringBoot 源码中大量使用)


排除策略可以叠加使用:


<context:component-scan base-package="com.yusael">


<context:exclude-filter type="assignable" expression="com.yusael.bean.User"/>


<context:exclude-filter type="aspectj" expression="com.yusael.injection..*"/>


</context:component-scan>


包含方式:设置扫描哪些注解




<context:component-scan base-package="com.yusael" use-default-filters="false">


<context:include-filter type="" expression=""/>


</context:component-scan>


与排除方式使用的区别:


  1. use-default-filters="false" 让 Spring 默认的注解扫描方式失效

  2. <context:include-filter type="" expression=""/> 用于指定扫描哪些注解


type="xxx" 与排除方式完全一样,可以参考上面


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

评论

发布
暂无评论
【Spring 基础注解】对象创建相关注解,java开发实战经典答案百度云