探索flutter框架开发的app在移动应用市场的潜力与挑战
930
2022-11-20
springboot原理实战(1)--注解方式装配bean
文章目录
1.@Configurable2.@Bean
a.@bean注入b.通过工厂方式注入
①官方提供,实现FactoryBean方式②自定义工厂方式
3.初始化bean前后做一些事情:
1)方式1:实现InitializingBean(初始化后触发), DisposableBean(销毁的时候触发)2)方式2:根据@Bean注解属性配置:3)方式3:@PostContruct
4.组件注入方式
①普通组件@Component②Resposity ,常用于数据库处理bean③@Service,常用于业务处理类④@controller,常用于请求控制类
5.依赖注入装配bean的方式
① @Autowire②@Resource JSR 250的方式③@Inject JSR-330的方式
6.组件注入需要扫描包支持,如何扫描包?
方式1,在AnnotationConfigApplicationContext上直接写报名:方式2:扫描配置类::
配置排除的包:
springboot是零配置的,所以必须了解到spring4以后的注解注入bean的方式,才是学习springboot的前提。
现在先了解下,具体的几种注入bean到spring的方式。
也就是来玩一下这个
AnnotationConfigApplicationContext这个类:
1.@Configurable
@Configurablepublic class MyConfig {}
测试:
public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class); System.out.println(context.getBean(MyConfig.class)); }
context.getBean有多种方式拿到bean,根据类class,类型等,
结果显示:容器拿到了这个bean:
2.@Bean
a.@bean注入
写个bean
public class MyBean {}
在配置类中@Bean注入,scope配置指定单个或者多个实例方式注入
@Bean(name = "mybean")@Scope("prototype") public MyBean createMyBean(){ return new MyBean(); }
b.通过工厂方式注入
①官方提供,实现FactoryBean方式
public class RunableFactoryBean implements FactoryBean
@Configurablepublic class MyConfig { @Bean public RunableFactoryBean createRunnableFactoryBean(){ return new RunableFactoryBean(); }}
测试,测试1:拿到工厂(用&符号前缀),测试2:拿到工厂创建的bean
public class Test1 { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class); System.out.println(context.getBean("&createRunnableFactoryBean")); System.out.println(context.getBean(Jeep.class)); }}
结果打印,都拿到了:
②自定义工厂方式
public class Car {}
public class JeepFactory { public Car create(){ return new Car(); }}
先注入工厂,在通过工厂拿到bean
@Configurablepublic class MyConfig { @Bean public JeepFactory creatJeepFactory(){ return new JeepFactory(); } @Bean public Car createJeep(JeepFactory factory){ return factory.create(); }}
测试:略
3.初始化bean前后做一些事情:
在初始化后和销毁的时候调用一些方法:
1)方式1:实现InitializingBean(初始化后触发), DisposableBean(销毁的时候触发)
public class Cat implements InitializingBean, DisposableBean { public Cat() { System.out.println("=======init cat========="); } @Override public void afterPropertiesSet() throws Exception { System.out.println("=======afterPropertiesSet========="); } @Override public void destroy() throws Exception { System.out.println("=======destroy========="); }}
2)方式2:根据@Bean注解属性配置:
public class Dog { public void init(){ System.out.println("init"); } public void destory(){ System.out.println("destory"); }}
@Bean(initMethod="init",destroyMethod="destory") public Dog createDog(){ return new Dog(); }
3)方式3:@PostContruct
public class Animal { @PostConstruct public void inital(){ System.out.println("------initial--------"); } @PreDestroy public void close(){ System.out.println("------close--------"); }}
4.组件注入方式
①普通组件@Component
@Component("myUser")public class User {}
②Resposity ,常用于数据库处理bean
@Repositorypublic class UserDao {}
③@Service,常用于业务处理类
@Servicepublic class UserService {}
④@controller,常用于请求控制类
@Controllerpublic class UserController {}
测试:
public class App { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class, User.class, UserDao.class, UserService.class, UserController.class); System.out.println(context.getBean(UserDao.class)); System.out.println(context.getBean(UserService.class)); System.out.println(context.getBean(UserController.class)); context.close(); }}
运行结果:
5.依赖注入装配bean的方式
① @Autowire
如果多个bean,可以用@Quitifier(“XX”)具体指定,也可使用@Primary提高bean的优先级。
@Controllerpublic class UserController { @Autowired private UserDao userDao;}
@Bean(name = "mybean") @Primary public MyBean createMyBean(){ return new MyBean(); }
②@Resource JSR 250的方式
@Controllerpublic class UserController { @Autowired private UserDao userDao; @Resource private UserService userService;}
③@Inject JSR-330的方式
需要导包,因为spring项目默认不支持。
import org.springframework.stereotype.Component;import javax.inject.Inject;@Component("myUser")public class User { //JSR-330 @Inject private Cat cat; @Override public String toString() { return "User{" + "cat=" + cat + '}'; }}
6.组件注入需要扫描包支持,如何扫描包?
方式1,在AnnotationConfigApplicationContext上直接写报名:
public class AnnocationClient { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.springboot.demo1", "com.springboot.demo2"); System.out.println(context.getBean(User.class)); System.out.println(context.getBean(UserDao.class)); System.out.println(context.getBean(UserController.class)); context.close(); }}
方式2:扫描配置类::
可以写个扫描配置类:
@ComponentScan(basePackages = "com.springboot.demo1", excludeFilters= @Filter(type = FilterType.ASSIGNABLE_TYPE,classes={DogConfig.class}))@Configurablepublic class AnnocationScan {}
注意,这里可以选择排除excludeFilters,后面说明咋排除。
public class AnnocationClient2 { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnnocationScan.class);// System.out.println(context.getBean(RunableFactoryBean.class)); System.out.println(context.getBean(User.class)); System.out.println(context.getBean(UserDao.class));// System.out.println(context.getBean(Cat.class)); System.out.println(context.getBean(UserController.class)); }}
配置排除的包:
public enum FilterType { ANNOTATION, //通过注解排除 ASSIGNABLE_TYPE, //通过指定的类排除 ASPECTJ, //通过aspectj表达式排除 REGEX, //通过正则表达式排除 CUSTOM; //自定义接口,实现org.springframework.core.type.filter.TypeFilter}排除 private FilterType() { }}
上面的截图是使用的ASSIGNABLE_TYPE自定类方式。
搜索: 怒放de每一天
不定时推送相关文章,期待和大家一起成长!!
完
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~