SpringIOC的注解应用

在之前的项目中,我们都是通过xml文件进行bean或者某些属性的赋值,其实还有另外一种注解的方式,在企业开发中使用的很多,在bean上添加注解,可以快速的将bean注册到ioc容器。

1、使用注解的方式注册bean到IOC容器中

spring.xml文件中需要设置要扫描的包

<!--
    如果想要将自定义的bean对象添加到IOC容器中,需要在类上添加某些注解
    Spring中包含4个主要的组件添加注解:
    @Controller:控制器,推荐给controller层添加此注解
    @Service:业务逻辑,推荐给业务逻辑层添加此注解
    @Repository:仓库管理,推荐给数据访问层添加此注解
    @Component:给不属于以上基层的组件添加此注解
    注意:我们虽然人为的给不同的层添加不同的注解,但是在spring看来,可以在任意层添加任意注解
           spring底层是不会给具体的层次验证注解,这样写的目的只是为了提高可读性,最偷懒的方式
           就是给所有想交由IOC容器管理的bean对象添加component注解

    使用注解需要如下步骤:
    1、添加上述四个注解中的任意一个
    2、添加自动扫描注解的组件,此操作需要依赖context命名空间
    3、添加自动扫描的标签context:component-scan

	注意:当使用注解注册组件和使用配置文件注册组件是一样的,但是要注意:
		1、组件的id默认就是组件的类名首字符小写,如果非要改名字的话,直接在注解中添加即可
		2、组件默认情况下都是单例的,如果需要配置多例模式的话,可以在注解下添加@Scope注解
    -->
    <!--
    定义自动扫描的基础包:
    base-package:指定扫描的基础包,spring在启动的时候会将基础包及子包下所有加了注解的类都自动
                扫描进IOC容器
    -->
    <context:component-scan base-package="cn.tulingxueyuan"></context:component-scan>

PersonController.java



@Controller
public class PersonController {
    public PersonController() {
        System.out.println("创建对象");
    }
}

2、定义扫描包时要包含的类和不要包含的类

当定义好基础的扫描包后,在某些情况下可能要有选择性的配置是否要注册bean到IOC容器中,此时可以通过如下的方式进行配置。

<context:component-scan base-package="cn.tulingxueyuan" use-default-filters="false">
        <!--
        当定义好基础扫描的包之后,可以排除包中的某些类,使用如下的方式:
        type:表示指定过滤的规则
            annotation:按照注解进行排除,标注了指定注解的组件不要,expression表示要过滤的注解
            assignable:指定排除某个具体的类,按照类排除,expression表示不注册的具体类名
            aspectj:后面讲aop的时候说明要使用的aspectj表达式,不用
            custom:定义一个typeFilter,自己写代码决定哪些类被过滤掉,不用
            regex:使用正则表达式过滤,不用
        -->
<!--        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->

        <!--指定只扫描哪些组件,默认情况下是全部扫描的,所以此时要配置的话需要在component-scan标签中添加 use-default-filters="false"-->
        <context:include-filter type="assignable" expression="cn.tulingxueyuan.service.PersonService"/>
    </context:component-scan>

@Value

<!--引用外部属性资源文件   可以通过@Value来获取里面的key值-->
    <context:property-placeholder location="db.properties"></context:property-placeholder>   

 /*
    使用 @Value设置依赖注入的属性
    1.除了可以写硬编码值
    2.还可以写${}  、#{}
    * */

//    @Value("fztx")
        @Value("${mysql.name}")
      //@Value("#{role.name}")
      private String name;

3、使用@AutoWired进行自动注入

使用注解的方式实现自动注入需要使用@AutoWired注解。

UserController.java

@Controller
public class UserController {
    /*
    使用@Autowired来实现自动注入
    bytype?  byname?
    ·默认优先根据类型去匹配
    ·如果匹配到多个类型则会按照名字匹配
    ·如果名又没有匹配到则会报错:
                    1.可以去修改属性的名字对应bean的名字:userServiceImpl
                    2.可以去修改Bean的名字对应属性的名字:@Service("userService")
                    3.可以通过@Qualifier设置属性的名字(覆盖) :@Qualifier("userServiceImpl")
                    4.可以通过@Primary 设置其中一个Bean为主要的自动注入Bean:@Primary
                    5.使用泛型作为自动注入限定符
     */
    @Autowired
    UserService userService;

    public void getUser(){
        userService.getUser();
    }
}
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserDao userDao;
    public void getUser() {
        userDao.getUser();
    }
}

4、@AutoWired可以进行定义在方法上

当我们查看@AutoWired注解的源码的时候发现,此注解不仅可以使用在成员变量上,也可以使用在方法上。

    /**
     * @Autowired 也可以写在方法上面
     * ·默认优先根据参数类型去匹配
     * ·如果匹配到多个类型则会按照参数名字匹配
     * @param userService

    @Autowired
    public void createUserSerive(@Qualifier("userServiceImpl")UserService userService){
        this.userService=userService;
    }*/
/**
     * @Autowired 也可以写在构造器上面
     * ·默认优先根据参数类型去匹配
     * ·如果匹配到多个类型则会按照参数名字匹配
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }*/

5、自动装配的注解@AutoWired,@Resource

在使用自动装配的时候,出了可以使用@AutoWired注解之外,还可以使用@Resource注解,大家需要知道这两个注解的区别。

1、@AutoWired:是spring中提供的注解,@Resource:是jdk中定义的注解,依靠的是java的标准

2、@AutoWired默认是按照类型进行装配,默认情况下要求依赖的对象必须存在,@Resource默认是按照名字进行匹配的,同时可以指定name属性。

3、@AutoWired只适合spring框架,而@Resource扩展性更好

@DependsOn("user")  
@Lazy  懒加载
@Scope("prototype")  作用域
 // 生命周期回调-3  初始化回调
    @PostConstruct
    public void init(){
        System.out.println("初始化");
    }

    // 生命周期回调-3  销毁回调
    @PreDestroy
    public  void destory(){
        System.out.println("销毁");
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值