Java spring 使用@Component默认返回的都是同一个对象吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java spring 使用@Component默认返回的都是同一个对象吗?相关的知识,希望对你有一定的参考价值。

这两个注解不是干一个事儿的啊,component相当于原来xml中把你标注了component注解的类注册成一个bean,autowired是默认按照类型自动装配 参考技术A 这个的关键在于被注入的对象是如何定义的,
如有@Scope("prototype"),则是非单例,否则默认是单例。

@Controller
@Scope("prototype")
public class LoginAction

追问

如何验证他是单例的呢?我用哈希码还是别的都不会相等啊

追答

验证的方法是获取两次,然后用==比较即可。

但是找到那个被注入的类文件去看看是最好的。

本回答被提问者和网友采纳
参考技术B @Scope("single") 就是单例模式了

Java程序员常用的@Component@Repository@Controller@Serv

Java程序员常用的@Component、@Repository、@Controller、@Service系列【案例demo3】
技术图片

很多程序员通过在类上使用@Repository、@Component、@Service 和 @Constroller 注解,Spring会自动创建相应的 BeanDefinition 对象,并注册到 ApplicationContext 中。这些类就成了 Spring受管组件。这三个注解除了作用于不同软件层次的类,其使用方式与@Repository 是完全相同的。

处理类:org.springframework.context.annotation.ScannedGenericBeanDefinition

[if !supportLists]· [endif]项目包结构

F:.

├─java

│ └─com

│ └─example

│ └─demo3

│ │ Demo3Application.java

│ │

│ ├─controll

│ │ StuController.java

│ │

│ ├─dao

│ │ StuDao.java

│ │ StuDaoImp.java

│ │

│ ├─entity

│ │ Stu.java

│ │

│ └─server

│ StuService.java

│ StuServiceImp.java

└─resources

    application.properties

    project.text

[if !supportLists]· [endif]控制器角色StuController

package com.example.demo3.controll;

import org.springframework.stereotype.Controller;

@Controller

public class StuController {

}

[if !supportLists]· [endif]数据角色StuDao、StuDaoImp

package com.example.demo3.dao;

public interface StuDao {

}

package com.example.demo3.dao;

import org.springframework.stereotype.Repository;

@Repository

public class StuDaoImp implements StuDao{

}

[if !supportLists]· [endif]服务角色StuService、StuServiceImp

package com.example.demo3.server;

public interface StuService {

}

package com.example.demo3.server;

import org.springframework.stereotype.Service;

@Service

public class StuServiceImp implements StuService {

}

[if !supportLists]· [endif]其它组件角色Stu

package com.example.demo3.entity;

import org.springframework.stereotype.Component;

@Component

public class Stu {

String name;

public Stu(String name) {

    this.name = name;

}

public Stu() {

}

public String getName() {

    return name;

}

public void setName(String name) {

    this.name = name;

}

@Override

public String toString() {

    return "Stu{" +

            "name=‘" + name + ‘‘‘ +

            ‘}‘;

}

}

[if !supportLists]· [endif]Demo3Application(启动程序)

package com.example.demo3;

import com.example.demo3.controll.StuController;

import com.example.demo3.dao.StuDao;

import com.example.demo3.entity.Stu;

import com.example.demo3.server.StuService;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication

public class Demo3Application {

public static void main(String[] args) {

    ConfigurableApplicationContext context = SpringApplication.run(Demo3Application.class, args);

    //@Component注册的组件,名称默认都是类名的首字母小写

    //纯属于注解方式注册组件

    //之所以能力扫描到这些包,因为注解@AutoConfigurationPackage的作用(但必须满足所有组件都在启动类所在包的平级或子集)

    StuController stuController = context.getBean("stuController", StuController.class);

    Stu stu = context.getBean("stu", Stu.class);

    StuDao stuDaoImp = context.getBean("stuDaoImp", StuDao.class);

    StuService stuServiceImp = context.getBean("stuServiceImp", StuService.class);

    //打印都有地址

    System.out.println(stuController);

    System.out.println(stu);

    System.out.println(stuDaoImp);

    System.out.println(stuServiceImp);

    context.close();

}

}

AnnotationConfigApplicationContext与ConfigurableApplicationContext的关系

总结:

1.上下文基本架构关系

2.ConfigurableApplicationContext:

3.ClassPathXmlApplicationContext:

4.AnnotationConfigApplicationContext:

以上是关于Java spring 使用@Component默认返回的都是同一个对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java spring 使用@Component默认返回的都是同一个对象吗?

java: spring注释:关于@component和@autowired

spring aspect为啥要加 component

Java程序员常用的@Component@Repository@Controller@Serv

Java Spring-注解进行属性注入

spring注解注入:<context:component-scan>详解(转)