Spring入门-Bean的三种创建方式

在Spring中,想要将一个Bean注册到容器中,我们可以有三种方式。

  • Xml文件注入,最基本的方式
  • 自动化扫描,需要配合注解
  • Java配置,在SpringBoot中使用广泛

Java配置

在Java配置中,我们只需要定义一个类来代替之前的application.xml文件。

@Configuration
public class SpringConfig {

    @Bean
    User user() {
        return new User();
    }
}
  • @Configuration -> 相当于application.xml,表示这是一个配置类
  • @Bean -> 相当于<bean class="com.bug.User" id="user"/>标签
  • 方法名相当于bean的id
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        User user = (User) ctx.getBean("user");
        System.out.println(user);
    }

自动化扫描

在SSM开发中,我们使用大量的自动化配置,自动化配置可以通过Java配置来实现,也可以通过xml配置来实现。
如果有一个类,我们希望在自动化扫描时将这个类注入到Spring容器中,那么可以给他添加一个@Component注解,作用相当于bean标签,不过需要被扫描到才能生效。
基于@Component注解,还有其他三个:

  • @Controller
  • @Service
  • @Repository
    这几个功能都是一致的,主要是为了区别不同的业务层时使用
  • 在Controller层,添加注解时,使用@Controller
  • 在Service层,添加注解时,使用@Servcie
  • 在Dao层时,添加注解时,使用@Dao
  • 在其他组件上,使用@Component
@Service
public class UserService {


    public void print() {
        System.out.println("调用了print...");
    }
}

接下来需要进行自动化扫描,自动化扫描有两种方法,一种时Java配置实现,一种是xml配置实现。如下Java配置:

Java配置扫描
@Configuration
@ComponentScan(basePackages = "com.bug.service")
public class SpringConfig {
}

当这个配置类加载时,会去扫描com.bug.service的注解,将相关类加入Spring容器中。

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        UserService userService = (UserService) ctx.getBean("userService");
        userService.print();
    }

注意通过@Service注解的类,bean的名字默认是类名首字母小写,如UserService,bean的名字为userService,当然也可以在Service注解里面自定义名字。

xml配置扫描
<context:component-scan base-package="com.bug.service"/>
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx =  new  ClassPathXmlApplicationContext("application.xml");
        UserService userService = (UserService) ctx.getBean("userService");
        userService.print();
    }

会发现,同样可以扫描到。

对象注入

自动扫描时对象注入主要有两种:

  • Autowired
  • Resources
@Repository
public class UserDao {
    public void print() {
        System.out.println("userDao...");
    }
}

在Service中注入

@Service
public class UserService {


    @Autowired
    private UserDao userDao;
    public void print() {
        System.out.println("调用了print...");
    }

    public void pDao() {
        userDao.print();
    }
}

配置自动化扫描

    <context:component-scan base-package="com.bug.service"/>
    <context:component-scan base-package="com.bug.dao"/>

结果测试

    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx =  new  ClassPathXmlApplicationContext("application.xml");
        UserService userService = (UserService) ctx.getBean("userService");
        userService.pDao();
    }

在这里插入图片描述
打印出结果,说明ok。

注解异同

  • @Autowired是根据类型去查找,这个对象只能有一个,否则报错。
  • @Resource是根据名称去查找,默认名称是变量名,也可以手动自定义名称,可以有多个对象实例。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值