14-自动装配与Autowired

使用注解方式实现Spring IoC

回到spring导航页

14-自动装配与Autowired

两类自动装配注解

分类注解说明
按类型装配@Autowired按容器内对象类型动态注入属性,由Spring机构提供
@Inject基于JSR-330(Dependency Injection for java)标准,其他同@Autowired,但不支持required属性
按名称装配@Named与@Inject配合使用,JSR-330规范,按属性名自动装配属性
@Resource基于JSR-250规范,优先按名称、再按类型智能匹配

按类型装配-示例代码一

自动装配与Autowired

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.18</version>
        </dependency>
package com.torey.spring.ioc.controller;

import org.springframework.stereotype.Controller;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/4/30 20:25
 * @描述:
 */
@Controller
public class UserController {

}

package com.torey.spring.ioc.dao;

import org.springframework.stereotype.Repository;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/4/30 20:06
 * @描述:
 */
//组件类型注解默认beanId为类名首字母小写,@Repository : beanId=userDao
//也可以指定beanId=@Repository("user"), beanId=user
@Repository
public class UserDao{
    public UserDao() {
        System.out.println(this.getClass().getName() + "正在被创建!");
    }

    public void getById(Long id){
        System.out.println(this.getClass().getName() + ".getById()");
    }
}

package com.torey.spring.ioc.service;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/4/30 20:22
 * @描述:
 */

import com.torey.spring.ioc.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    public UserService() {
        System.out.println(this.getClass().getName() + "正在被创建!");
    }

    @Autowired
//如果装配注解放在set方法上,则自动按类型/名称对set方法参数进行注入
    //如果放在属性上,则不再执行set方法
    private UserDao userDao;
    //如果装配注解放在set方法上,则自动按类型/名称对set方法参数进行注入,实际项目这种一般不使用
    //如果放在属性上,则不再执行set方法
//    @Autowired
//    public void setUserDao(UserDao userDao) {
//        System.out.println(this.getClass().getName() + ".setUserDao()");
//        this.userDao = userDao;
//    }
    public void getById(Long id){
        System.out.println(this.getClass().getName() + ".getById()");
        userDao.getById(id);
    }

    public UserDao getUserDao() {
        return userDao;
    }
}

package com.torey.spring.ioc.util;

import org.springframework.stereotype.Component;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/4/30 20:27
 * @描述:
 */
@Component("stringUtils")
public class StringUtils {

}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
    <!--在IoC容器初始化时自动扫描四种组件类型注解并完成实例化
    @Repository  @Service   @Controller  @Component
    -->
    <context:component-scan base-package="com.torey.spring.ioc.*"></context:component-scan>
</beans>
package com.torey.spring.ioc;

import com.torey.spring.ioc.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/4/30 20:13
 * @描述:
 */
public class SpringApplication {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        UserService userService = context.getBean("userService", UserService.class);
        userService.getById(5L);
    }
}

一个接口有多个实现类的解决方法

按类型注入时,当一个接口有多个实现类时的解决方法如下:

  1. 将另外一个实现类的@Repository注解去掉
  2. 在其中一个实现类中加上@Primary注解
package com.torey.spring.ioc.dao;

import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/4/30 20:06
 * @描述:
 */
//组件类型注解默认beanId为类名首字母小写,@Repository : beanId=userDao
//也可以指定beanId=@Repository("user"), beanId=user
@Repository
public class UserDao implements IUserDao{
    public UserDao() {
        System.out.println(this.getClass().getName() + "正在被创建!");
    }

    public void getById(Long id){
        System.out.println(this.getClass().getName() + ".getById()");
    }
}
package com.torey.spring.ioc.dao;

import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/4/30 20:06
 * @描述: @Primary: 如果容器中出现两个实现类,标注@Primary的类可以被使用
 */
@Repository
@Primary
public class UserOracleDao implements IUserDao{
    public UserOracleDao() {
        System.out.println(this.getClass().getName() + "正在被创建!");
    }

    public void getById(Long id){
        System.out.println(this.getClass().getName() + ".getById()");
    }
}

package com.torey.spring.ioc.service;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/4/30 20:22
 * @描述:
 */

import com.torey.spring.ioc.dao.IUserDao;
import com.torey.spring.ioc.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    public UserService() {
        System.out.println(this.getClass().getName() + "正在被创建!");
    }

    @Autowired
    private IUserDao userDao;
    public void getById(Long id){
        System.out.println(this.getClass().getName() + ".getById()");
        userDao.getById(id);
    }
}

导航,上一页,下一页

13四种组件类型注解

15Resource按名称装配

支持我-微信扫一扫-加入微信公众号

Aseven公众号

赞赏作者

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值