Spring之bean的实例化和依赖注入

最近天天看spring springboot,脑袋里面早已经神仙打架,一团浆糊,知道了A怎么用,B也可以这么用,然就一团浆糊,好痛苦啊,我天天在想造出这个轮子的人究竟是何方神圣。

bean的解释:在 Spring 中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。bean是一个由Spring IoC容器实例化、组装和管理的对象。
总结:
1.bean是对象,一个或者多个不限定
2.bean由Spring中一个叫IoC的东西管理
3.我们的应用程序由一个个bean构成

xml配置三种实例化Bean的方式
1.使用类构造器实例化(默认无参数)


2.使用静态工厂方法实例化

xml:

java代码块:
 public class PersonServiceFactory {
       public  static PersonService createPersonService(){
                 return new PersonServiceImpl();
       }
 }

3.使用实例工厂方法实例化

xml:

  
java代码块:
 public class PersonServiceFactory {
        public  PersonService createPersonService(){
                      return new PersonServiceImpl();
        }
 }

依赖注入
当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入到调用者中

  • Bean的xml注入方式

1、构造方法注入
Spring之bean的实例化和依赖注入_第1张图片
2、setter方法注入

(1)普通属性

Spring之bean的实例化和依赖注入_第2张图片
(2)对象属性
Spring之bean的实例化和依赖注入_第3张图片

  • 实际项目中使用的依赖注入,使用xml方式配置定时任务
    applicationContext-schecule.xml

   
   
   
   	  
   
   
   
   	 
   	
   		
   
   
   
   
   	
   		   		 
   		
   		
   	
   	
   	
   		 
   		org.quartz.simpl.SimpleThreadPool
   			5
   			4
   			org.quartz.simpl.RAMJobStore
   			60000
   		
   	
   

  • 总结
    依赖注入就是通过配置文件解决代码问题

注解方式
一、使用注解定义Bean
Component 描述Spring框架中Bean
除了@Component外,Spring提供了3个功能基本和@Component等效的注解
@Repository 用于对DAO实现类进行标注
@Service 用于对Service实现类进行标注
@Controller 用于对Controller实现类进行标注
这三个注解是为了让标注类本身的用途清晰,Spring在后续版本会对其增强

二、自动装配Bean

1、普通属性
//set info的值 普通属性注入
@Value(value=“itcast”)
private String info;

2、对象属性

(1)使用@Autowired 进行自动注入,@Autowired 默认按照类型进行注入,如果存在两个相同Bean类型相同,则按照名称注入
@Service (service层),@Repsitory(dao层),@Controller(controller层),@Component(普通类)都是实例化对象后交给IoC容器进行管理
@Autowired 按类型进行属性对象注入
Spring之bean的实例化和依赖注入_第4张图片
通过@Autowired的required属性,设置一定要找到匹配的Bean
使用@Qualifier指定注入Bean的名称
使用Qualifier 指定Bean名称后,注解Bean必须指定相同名称
在这里插入图片描述
(2)使用@Resource注入
按名称进行注入
上面等价于@Resource(name=“uDAO”)

@Configuration和@Bean的用法和理解

1、第一种自己写的类,Controller,Service。 用@controller @service即可

2、第二种,集成其它框架,比如集成shiro权限框架,集成mybatis分页插件PageHelper,第三方框架的核心类都要交于Spring大管家管理

@Configuration可理解为用spring的时候xml里面的标签

@Bean可理解为用spring的时候xml里面的标签

Spring Boot不是spring的加强版,所以@Configuration和@Bean同样可以用在普通的spring项目中,而不是Spring Boot特有的,只是在spring用的时候,注意加上扫包配置

,普通的spring项目好多注解都需要扫包,才有用,有时候自己注解用的挺6,但不起效果,就要注意这点。

Spring Boot则不需要,主要你保证你的启动Spring Boot main入口,在这些类的上层包就行

用@Bean注解的方法:会实例化、配置并初始化一个新的对象,这个对象会由spring IoC 容器管理。

实例:

@Configuration
public class AppConfig {
 
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
 
}

生成对象的名字:默认情况下用@Bean注解的方法名作为对象的名字。但是可以用 name属性定义对象的名字,而且还可以使用name为对象起多个名字

@Configuration
public class AppConfig {
 
    @Bean(name = "myFoo")
    public Foo foo() {
        return new Foo();
    }
 
}
@Configuration
public class AppConfig {
 
    @Bean(name = { "dataSource", "subsystemA-dataSource", "subsystemB-dataSource" })
    public DataSource dataSource() {
        // instantiate, configure and return DataSource bean...
    }
 
}

@Bean 一般和 @Component或者@Configuration 一起使用:@Component和@Configuration不同之处

在 @Component 注解的类中不能定义 类内依赖的@Bean注解的方法。@Configuration可以。

就像这样,DemoApplication是启动类,关于启动类的位置放置,在另一篇博客有专门的去分析。

@Configuration和@Bean的Demo类

@Configuration  
public class ExampleConfiguration {  
  
    @Value("com.mysql.jdbc.Driver")  
    private String driverClassName;  
  
    @Value("jdbc://xxxx.xx.xxx/xx")  
    private String driverUrl;  
  
    @Value("${root}")  
    private String driverUsername;  
  
    @Value("123456")  
    private String driverPassword;  
  
    @Bean(name = "dataSource")  
    public DataSource dataSource() {  
        BasicDataSource dataSource = new BasicDataSource();  
        dataSource.setDriverClassName(driverClassName);  
        dataSource.setUrl(driverUrl);  
        dataSource.setUsername(driverUsername);  
        dataSource.setPassword(driverPassword);  
        return dataSource;  
    }  
  
    @Bean  
    public PlatformTransactionManager transactionManager() {  
        return new DataSourceTransactionManager(dataSource());  
    }  
  
}

这样,在项目中

@Autowired

private DataSource dataSource;

的时候,这个dataSource就是我们在ExampleConfiguration中配的DataSource

写到这儿感觉稍稍的理解了一点点儿,大部部分都是参考的,参考地址:
https://www.cnblogs.com/yss818824/p/12289868.html
https://blog.csdn.net/u013360022/article/details/51824674

你可能感兴趣的:(spring,java)