Springboot6——对象管理单例多例
根据编程不良⼈视频整理
controller单例还是多例springboot中的对象管理
⼯⼚特性对象⼜分为单个对象和多个对象,对于单个对象的管理相对⽐较⽅便。
管理单个对象:在springboot中可以管理⾃定义的简单组件对象的创建可以直接使⽤注解形式的创建
使⽤@Repository @Service @Controller 以及@Component管理不同简单对象
之前在controller包中新建了HelloController.java类
现在在com.estella下新建service包->新建UserService.java接⼝
public interface UserService {
void save(String name);
}
在service包下新建UserServiceImpl.java实现类
ctrl+O 相当于右键Generate->Override methods 重写接⼝中的⽅法
soutv 相当于打当前变量的名字
注意:需要在UserServiceImpl类上添加@Service注解,否则在HelloController.java中⽆法autowire UserService的对象,会报错。(autowire是⾃动配置的意思)通过添加@Service注解,直接创建了Service对象。
回到HelloController.java
在类中添加代码
@Autowired
private UserService userService;
在hello⽅法中添加
userService.save("jenny");
管理多个对象
在springboot中如果要管理复杂对象必须使⽤@Configuratio+@Bean注解进⾏管理
@Configuration注解是⽤来配置的,可以⼀次性管理多个对象,⽆论是直接new的类还是抽象类接⼝类型的实例也可以交给它管理。
在com.estella.BeansConfig类中,之前已经建过该类
举例,在该类中新建⼀个⽇历对象,⽇历类本⾝就是⼀个抽象类,如果要做实例化的话,必须得通过调⽤它内部的静态⽅法去实例化,结合@Configuration注解需要在getCalendar⽅法前添加注解@Bean
@Bean⽤来将该⽅法的返回值交给springboot管理。原来我们⽤xml或者注解的⽅式进⾏创建对象的话,默认创建出来的对象在⼯⼚中都有⼀个唯⼀的标识,以这种对象默认创建出来的标识,在⼯⼚中默认标识:类名⾸字母⼩写。
@Bean
public Calendar getCalendar(){
Instance();
}
举例:当前的Calendar创建出来之后,实际上标识就是⼩写的calendar
注意:getInstance是⼀个函数,在java中,可以使⽤这种⽅式使⽤单例模式创建类的实例,所谓单例模式就是⼀个类有且只有⼀个实例。
创建之后就可以注⼊去⽤了。
在HelloController.java中添加
@Autowired
private Calendar calendar;
在hello⽅法中写⼊
System.out.Time());
运⾏程序控制台输出
Wed Oct 14 17:05:11 CST 2020
问题:这个在⼯⼚中的名字是否可以改?
例如@Bean(name=“aaa”),这样的话⽇后在⼯⼚中构建出来的对象名字为aaa,⽬前没有什么影响,但⽇后需要基于名字去获取的时候,就有⽤处了。但⼀般不建议修改,默认的⽅式还是⽐较好的。
观察@Bean这种⽅式是否是多例?
在HelloController.java类中添加代码
@Autowired
private Calendar calendar1;
并在hello⽅法中添加
System.out.println(calendar);
System.out.println(calendar1);
System.out.println(calendar==calendar1);
控制台输出结果:
java.util.GregorianCalendar[time=1602673750866,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai" ,offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2020,MONTH =9,WEEK_OF_YEAR=42,WEEK_OF_MONTH=3,DAY_OF_MONTH=14,DAY_OF_YEAR=288,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=2,AM_PM= 1,HOUR=7,HOUR_OF_DAY=19,MINUTE=9,SECOND=10,MILLISECOND=866,ZONE_OFFSET=28800000,DST_OFFSET=0]
java.util.GregorianCalendar[time=1602673750866,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai" ,offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2020,MONTH =9,WEEK_OF_YEAR=42,WEEK_OF_MONTH=3,DAY_OF_MONTH=14,DAY_OF_YEAR=288,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=2,AM_PM= 1,HOUR=7,HOUR_OF_DAY=19,MINUTE=9,SECOND=10,MILLISECOND=866,ZONE_OFFSET=28800000,DST_OFFSET=0]
true
⽐较结果是true,说明默认以单例的形式创建
问题:想要变为多例?
解决⽅法:在BeansConfig.java⽂件中的@Bean注解下加上注解@Scope()作⽤:⽤来设置在⼯⼚中创建的对象是否是多例。
@Scope(”prototype“)多例
默认是singleton单例
改为多例后再次运⾏程序
java.util.GregorianCalendar[time=1602674570332,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai" ,offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2020,MONTH =9,WEEK_OF_YEAR=42,WEEK_OF_MONTH=3,DAY_OF_MONTH=14,DAY_OF_YEAR=288,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=2,AM_PM= 1,HOUR=7,HOUR_OF_DAY=19,MINUTE=22,SECOND=50,MILLISECOND=332,ZONE_OFFSET=28800000,DST_OFFSET=0]
java.util.GregorianCalendar[time=1602674570332,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai" ,offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2020,MONTH =9,WEEK_OF_YEAR=42,WEEK_OF_MONTH=3,DAY_OF_MONTH=14,DAY_OF_YEAR=288,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=2,AM_PM= 1,HOUR=7,HOUR_OF_DAY=19,MINUTE=22,SECOND=50,MILLISECOND=332,ZONE_OFFSET=28800000,DST_OFFSET=0]
false
false说明两个对象不同,即为多例
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论