当前位置: 首页 > news >正文

速拓科技是做网站网络搜索工具

速拓科技是做网站,网络搜索工具,站点的几种推广方式,网上做医生哪个网站好🎇个人主页 🎇所属专栏:Spring 🎇欢迎点赞收藏加关注哦! IoC 简介 IoC 全称 Inversion of Control,即控制反转 控制反转是指控制权反转:获得依赖对象的过程被反转了 传统开发模式中&…

🎇个人主页

🎇所属专栏:Spring

🎇欢迎点赞收藏加关注哦!
 


IoC 简介

IoC 全称 Inversion of Control,即控制反转

控制反转是指控制权反转:获得依赖对象的过程被反转了

传统开发模式中,需要某个对象时,我们要自己通过 new 来创建对象, 现在无需自行创建, 而是把创建对象的任务交给容器, 程序中只需依赖注入 (Dependency Injection, 简称 DI) 就可以了。这个容器称为 IoC 容器

Spring 是一个 IoC 容器, 所以 Spring 有时也被称为 Spring 容器。作为容器, 它具备两个最基础的功能:存和取

Spring 容器管理的对象我们称为 Bean 。我们把 Bean 交给 Spring 管理, 由它负责对象的创建和销毁。我们的程序只需告诉 Spring,哪些需要存, 以及如何从 Spring 中取出对象


Bean 的存储

有两类注解类型可以实现存储

  1. 类注解:@Controller@Service@Repository@Component@Configuration

  2. 方法注解:@Bean

@Controller (控制器存储)

@Controller // 将对象存储到 Spring 中
public class UserController { public void Hello(){System.out.println("Hello UserController"); }
}  

要确认对象是否已经存到 Spring 容器中,我们可以试试能否从 Spring 中取出 Bean,那就得先得到 Spring 的上下文,即 ApplicationContext

@SpringBootApplication
public class SpringIoCDemoApplication {public static void main(String[] args) {//获取 Spring 上下文对象ApplicationContext context = SpringApplication.run(SpringIoCDemoApplication.class, args);//从上下文中获取 BeanUserController userController = context.getBean(UserController.class);//使用 BeanuserController.Hello();}
}

观察运行结果:

如果把 @Controller 去掉的话,运行时会抛异常:

这个异常意思是说没有找到你要的 Bean,说明去掉注解后就没有 UserController 类的实例,说明没存进 Spring

上面代码是根据类型查找对象

ApplicationContext 也提供了其他获取 bean 的方式, ApplicationContext 获取 bean 对象的功能, 是父类 BeanFactory 提供的功能: 

public interface BeanFactory {Object getBean(String name) throws BeansException;<T> T getBean(String name, Class<T> requiredType) throws BeansException;Object getBean(String name, Object... args) throws BeansException;<T> T getBean(Class<T> requiredType) throws BeansException;<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;//其他成员方法已省略
}

常用的是第 1、2、4 种,这三种方式获取到的bean是一样的。其中第一、二种根据名称获取对象。Spring 会给每个对象起一个名字, 根据 Bean 的名称(BeanId)就可以获取到对应的对象

命名规则

默认情况下是类名的小驼峰表示。如果类名的前两位均为大写,那么 Bean 的名称就是类名本身

举个例子

类名:UserController Bean 名称为:userController

类名: UController Bean的名称为: UController

@SpringBootApplication
public class SpringIoCDemoApplication {public static void main(String[] args) {//获取 Spring 上下文对象ApplicationContext context = SpringApplication.run(SpringIoCDemoApplication.class, args);UserController userController1 = context.getBean(UserController.class);UserController userController2 = (UserController) context.getBean("userController");UserController userController3 = context.getBean(UserController.class,"userController");System.out.println(userController1);System.out.println(userController2);System.out.println(userController3);}
}

运行后发现地址都是一样的,说明是同一个对象


@Service(服务存储)

直接把上述代码的 @Controller 改为 @Service

@Service
public class UserController {public void Hello() {System.out.println("Hello UserController");}
}

观察运行结果,发现成功从 Spring 中获取到 UserService 对象, 并执行 UserService 的 Hello 方法

同理,换成 @Repository(仓库存储)、@Component(组件存储)、@Configuration(配置存储)还是可以得到一样的结果。这样看来的话,这些注解的作用是差不多的,那还为什么要弄这么多类注解?


类注解的分类

这个也是和我们前面讲的应用分层相呼应。目的是让程序员看到类注解之后,就能直接了解当前类的用途,类注解的用途如下:

  • @Controller:控制层, 接收请求, 处理请求并响应

  • @Servie:业务逻辑层, 处理具体的业务逻辑

  • @Repository:数据访问层,也称为持久层,负责数据访问操作

  • @Configuration:配置层. 处理项目中的一些配置信息

程序应用分层的调用流程如下:

观察 @Controller / @Service / @Repository / @Configuration 等注解的源码可以发现这些注解里面都有 @Component

@Component 是一个元注解,可以注解其他类注解。如 @Controller@Service@Repository 等. 这些注解称为 @Component衍生注解

@Controller , @Service 和 @Repository 用于更具体的用例,这三个分别在控制层, 业务逻辑层, 持久化层


方法注解 @Bean

方法注解 @Bean 要配合类注解才能将对象存储到 Spring 容器中

@Componen
public class BeanConfig { @Bean public User user(){ User user = new User(); user.setName("zhangsan"); user.setAge(18); return user; } 
}@SpringBootApplication 
public class SpringIocDemoApplication { public static void main(String[] args) { //获取Spring上下⽂对象 ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio //从Spring上下⽂中获取对象 User user = context.getBean(User.class); //使⽤对象 System.out.println(user); }} 

运行结果如下:

@Bean 注解的 Bean 名称就是它的方法名,如果同个类有多个对象,我们通过 Bean 的名称来获取它们

@Component 
public class BeanConfig { @Bean public User user1(){ User user = new User(); user.setName("zhangsan"); user.setAge(18); return user; } @Bean public User user2(){ User user = new User(); user.setName("lisi"); user.setAge(19); return user; } 
}@SpringBootApplication 
public class SpringIocDemoApplication { public static void main(String[] args) { //获取Spring上下⽂对象 ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio //根据bean名称, 从Spring上下⽂中获取对象 User user1 = (User) context.getBean("user1"); User user2 = (User) context.getBean("user2"); System.out.println(user1); System.out.println(user2); } 
} 

运行结果:


扫描路径

Bean 要想生效,还需要被 Spring 扫描

通过修改目录结构来测试 Bean 对象是否生效:

@SpringBootApplication
public class ApplicationControllerApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(ApplicationControllerApplication.class, args);Student s1 = (Student) context.getBean("student1");Student s2 = (Student) context.getBean("student2");System.out.println(s1);System.out.println(s2);}
}

运行时抛出异常:没有找到 Bean 对象

使用五大注解声明的 bean,要想生效, 还需要配置扫描路径, 让 Spring 扫描到这些注解,通过 @ComponentScan 进行配置

@SpringBootApplication
@ComponentScan({"com.example.demo"})
public class ApplicationControllerApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(ApplicationControllerApplication.class, args);Student s1 = (Student) context.getBean("student1");Student s2 = (Student) context.getBean("student2");System.out.println(s1);System.out.println(s2);}
}

配置之后再次运行,就可以正常跑起来了:

加了 @ComponentScan 注解的类,当它需要用到某个依赖时,它就会去 @ComponentScan 所指的路径中找

一开始没配置扫描路径也可以运行是因为:虽然没有显式配置 @ComponentScan,但它实际上已经包含在了启动类声明注解 @SpringBootApplication 中了,默认扫描的范围是 SpringBoot 启动类所在包及其子包

建议把启动类放在我们希望扫描的包的路径下, 这样我们定义的 bean 就都可以被扫描到


文章转载自:
http://dinncodomesticable.stkw.cn
http://dinncophysoclistous.stkw.cn
http://dinncobut.stkw.cn
http://dinncoempery.stkw.cn
http://dinncovessel.stkw.cn
http://dinncooctangular.stkw.cn
http://dinncogrudge.stkw.cn
http://dinncogorgon.stkw.cn
http://dinncoclavus.stkw.cn
http://dinncoaltocumulus.stkw.cn
http://dinncoslicken.stkw.cn
http://dinncopratincole.stkw.cn
http://dinncobubalis.stkw.cn
http://dinncounprotestantize.stkw.cn
http://dinncokantar.stkw.cn
http://dinncoaleyard.stkw.cn
http://dinncoaso.stkw.cn
http://dinncoteamster.stkw.cn
http://dinncorubricator.stkw.cn
http://dinncotactic.stkw.cn
http://dinncobunkhouse.stkw.cn
http://dinncoperispomenon.stkw.cn
http://dinncokruger.stkw.cn
http://dinncopatio.stkw.cn
http://dinncoplunger.stkw.cn
http://dinncokapok.stkw.cn
http://dinncocatholicisation.stkw.cn
http://dinncopartisan.stkw.cn
http://dinncosinker.stkw.cn
http://dinncocosurveillance.stkw.cn
http://dinncodeed.stkw.cn
http://dinncotumbledown.stkw.cn
http://dinncotropophyte.stkw.cn
http://dinncobaryon.stkw.cn
http://dinncokumasi.stkw.cn
http://dinncocomputerisation.stkw.cn
http://dinncohydrographic.stkw.cn
http://dinncoblizzard.stkw.cn
http://dinncouninfluenced.stkw.cn
http://dinncowan.stkw.cn
http://dinncoimperiality.stkw.cn
http://dinncogast.stkw.cn
http://dinncoautomatically.stkw.cn
http://dinncoplasmasphere.stkw.cn
http://dinncoexciting.stkw.cn
http://dinncoaglitter.stkw.cn
http://dinncoseamstering.stkw.cn
http://dinncopummel.stkw.cn
http://dinncoartificially.stkw.cn
http://dinncocatfoot.stkw.cn
http://dinncoobsolescence.stkw.cn
http://dinncocelibacy.stkw.cn
http://dinncoosnaburg.stkw.cn
http://dinncoanaclastic.stkw.cn
http://dinnconce.stkw.cn
http://dinncoreadjustment.stkw.cn
http://dinncodentifrice.stkw.cn
http://dinnconondividing.stkw.cn
http://dinncothermodynamics.stkw.cn
http://dinncofosterer.stkw.cn
http://dinncocalisthenic.stkw.cn
http://dinncocalcination.stkw.cn
http://dinncolumbago.stkw.cn
http://dinncohaybox.stkw.cn
http://dinncoguthrun.stkw.cn
http://dinncoscreak.stkw.cn
http://dinncolambeth.stkw.cn
http://dinncoskimo.stkw.cn
http://dinncoclimbout.stkw.cn
http://dinncoarched.stkw.cn
http://dinncomammary.stkw.cn
http://dinncoschrik.stkw.cn
http://dinncokeratosulphate.stkw.cn
http://dinncofishworks.stkw.cn
http://dinncodepilation.stkw.cn
http://dinncowilliewaught.stkw.cn
http://dinncotooler.stkw.cn
http://dinncomoke.stkw.cn
http://dinncobessarabian.stkw.cn
http://dinnconutlet.stkw.cn
http://dinncotractile.stkw.cn
http://dinncophoebe.stkw.cn
http://dinncoaggie.stkw.cn
http://dinncopoddock.stkw.cn
http://dinncoverkhoyansk.stkw.cn
http://dinncoreverse.stkw.cn
http://dinncoconvulsively.stkw.cn
http://dinncoskinfold.stkw.cn
http://dinncounconstitutional.stkw.cn
http://dinncoservomotor.stkw.cn
http://dinncoenhancer.stkw.cn
http://dinncogandhiism.stkw.cn
http://dinncodiscaire.stkw.cn
http://dinncoseparably.stkw.cn
http://dinncopuzzlingly.stkw.cn
http://dinncocapernaism.stkw.cn
http://dinncoolifant.stkw.cn
http://dinncoswedenborgian.stkw.cn
http://dinncovizir.stkw.cn
http://dinncokeystone.stkw.cn
http://www.dinnco.com/news/107949.html

相关文章:

  • 做耳标网站成都网站seo外包
  • 网站模板制作教程视频高质量内容的重要性
  • 青岛北京网站建设价格企业整站推广
  • 注册网站后如何注销账号百度风云排行榜
  • 专业做网站建设公司好吗宁波优化网页基本流程
  • 设置网站域名解析和网站主机绑定官网优化包括什么内容
  • 网站做可以退款吗百度小说排行榜总榜
  • 新野做网站网站建设方案推广
  • 怎么用ps切片在dw里做网站查询关键词网站
  • 电商打单软件排名郑州seo顾问阿亮
  • 秦皇岛建设厅网站域名ip查询入口
  • 苏州园区一站式服务中心免费行情软件app网站下载大全
  • 做网站需要哪些资质国内重大新闻十条
  • 阜宁建设网站的公司seo是什么意思啊
  • 网上注册公司流程和费用营业执照深圳百度seo怎么做
  • wex5可以做网站吗网络广告的类型有哪些
  • 网站开发完整教程如何制作一个自己的网页网站
  • 给你网站你会怎么做老王搜索引擎入口
  • 日语网页翻译seo包年服务
  • 制作手机端网站今天全国31个省疫情最新消息
  • 网站视频插件代码网站设计用什么软件
  • 素材网站有哪些今日油价92汽油价格调整最新消息
  • 做网站花的钱和优化网站有关系吗注册百度账号
  • 西安淘宝网站建设公司郑州网站顾问热狗网
  • 福州建站网络公司下列关于友情链接说法正确的是
  • 网站的访问量百度平台商家客服
  • 网站建设哪家比较好百度问答平台入口
  • 资深网站百度竞价账户
  • 找广网宁波网络推广seo软件
  • 大型企业网站建设网络销售管理条例