java bean实际上时java程序中对类约定的定义规则
是一套规范,有了这套规范,方便使用和交流
我们之前的案例中使用的是@Bean来进行的注入
这种注入是需要编写代码的
如果需要实例化后为属性赋值或者类似操作,我们可以使用@Bean来注入到Spring容器
但是有些类没有需要赋值的属性,那么使用@Bean注入就比较麻烦了
可以使用@Component(英文:“组件”)
来标记在需要注入的类上,这样Spring内部可以自动注入
注入对象的id名是类名首字母小写的状态
例如:DragonBlade —> dragonBlade
但是如果类名是连续两个或以上的大写字母,那么id就是类名
例如:AWPGun —> AWPGun
注意光在类上加注解是不够的
还需要在Config类上加扫描的注解
小结组件扫描注入过程
在要注入的类上加注解@Component
注意类名生成的ID
别忘了在Config类上编写@ComponentScan扫描目标包
@Component
@Controller
@Service
等多种注解都可以响应组件扫描将这个类注入到Spring容器
一个功能分这么多注解的原因并不是注解的功能不同
区别仅在于他们单词的意思不同
我们使用的时候根据当前类的角色使用不同单词来注入
使用@bean注入时可以使用下面的方法自定义注入Spring容器的id
@Bean("caocao")
使用@Component以及其他可以组件注入的注解时
使用下面方法自定义注入Spring容器的id
@Component("db")
什么是作用域
我们将Spring中Bean的作用域分为两种
1.单例(singleton):
当前这个注入的对象在Spring容器中只有1个
无论何时获取,均获得这同一个对象
Spring默认情况下管理Bean就是单例的
2.原型(prototype):
原型模式下,我们使用的注入只是一个模板
每次获得对象时,新实例化对象返回给我们的调用
所以每次获得得对象不是同一对象,互相没有关联
单例的好处:
节省内存,但是不能记录不同的属性或状态
原型的好处:
可以获得不同的对象,保存不同的属性或状态,但是频繁获取会制造过多对象,浪费内存
设置方式:
单例是默认的,无需设置
原型模式@Bean注入
@Bean("caocao")
@Scope("prototype")//原型
public Stu student(){
Stu stu = new Stu();
stu.setName("曹操");
stu.setAge(60);
return stu;
}
组件扫描
@Component("db")
@Scope("prototype")//原型
public class DragonBlade {
....
}
单例下我们在实例化Spring容器时就会自动创建单例的对象
如果程序中不使用这个对象,反而会造成内存的浪费
我们怎么弥补这个缺点呢?(这个情况只针对单例的对象)
使用懒惰初始化
懒惰初始化就是在程序使用到这个对象时在实例化这个对象的策略
一般用于不确定是否使用的对象使用注解
@Lazy
@Bean注入方式
@Bean("caocao")
//@Scope("prototype")
@Lazy//懒惰加载
public Stu student(){
Stu stu=new Stu();
stu.setName("曹操");
stu.setAge(60);
return stu;
}
组件扫描注入方式
@Component("db")
@Lazy//懒惰初始化
public class DragonBlade {
...
}
在实际开发中
一个项目可以有多个配置类
程序运行时他们都需要加载
最简单的办法就是在ACAC构造方法里使用,分割编写多个配置类的反射
例如
ctx=new AnnotationConfigApplicationContext(
Config.class, Config2.class);
但是上面的代码在新增更多配置类时还是需要维护的
name我们可以在某个配置类中通过添加@Import注解的方式,不修改具体代码来添加配置类
@ComponentScan("cn.tedu.hero")
@Import({Config2.class})//同时加载Config2这个类中的Spring配置
public class Config {
....
}