最近天天看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容器来完成,然后注入到调用者中
(1)普通属性
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 按类型进行属性对象注入
通过@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 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