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

给网站栏目页做反链好吗中国建设银行陕西分行官方网站

给网站栏目页做反链好吗,中国建设银行陕西分行官方网站,wordpress链接指向本地,泉州手机网站开发✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录 lombok的使用案例引入作用域定义singleton单例作用域prototype原型作用域(多例作用域)request请求作用域session会话作用域ap…

✏️作者:银河罐头
📋系列专栏:JavaEE

🌲“种一棵树最好的时间是十年前,其次是现在”

目录

  • lombok的使用
  • 案例引入
  • 作用域定义
    • singleton单例作用域
    • prototype原型作用域(多例作用域)
    • request请求作用域
    • session会话作用域
    • application全局作用域
    • websocket
  • 设置作用域
  • Spring 执行流程
  • Bean 的生命周期
    • 代码演示

lombok的使用

1.添加依赖

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version><scope>provided</scope>
</dependency>

2.在实体类使用 lombok 注解。

package com.java.demo.entity;
import lombok.Getter;
import lombok.Setter;//lombok
@Setter
@Getter
public class User {private int id;private String name;
}

image-20230504202634861

image-20230504202646100

案例引入

package com.java.demo.entity;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
//lombok
@Setter
@Getter
@ToString
public class User {private int id;private String name;
}
package com.java.demo.component;
import com.java.demo.entity.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;@Component
public class UserBeans {@Beanpublic User user(){User user = new User();user.setId(1);user.setName("张三");return user;}
}
package com.java.demo.controller;
import com.java.demo.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class UserController {@Autowiredprivate User user;public void printUser(){System.out.println(user);User myUser = user;myUser.setName("悟空");System.out.println("myUser -> " + myUser);System.out.println("user -> " + user);}
}
package com.java.demo.controller;
import com.java.demo.entity.User;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;@Controller
public class UserController2 {@Resourceprivate User user;public void printUser2(){System.out.println("user -> " + user);}
}
package com.java.demo;
import com.java.demo.controller.UserController;
import com.java.demo.controller.UserController2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {ApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");UserController userController =context.getBean("userController",UserController.class);userController.printUser();UserController2 userController2 =context.getBean("userController2",UserController2.class);userController2.printUser2();}
}
我的预期结果是:
User(id=1, name=张三)
myUser -> User(id=1, name=悟空)
user -> User(id=1, name=张三)
user -> User(id=1, name=张三)

image-20230504210404526

但运行之后结果是这样。

为什么会出现这种现象?

原因是 Bean 的作用域(scope)默认是单例模式,此 Bean 在 整个 spring 容器中只有一份。

作用域定义

Bean 的 6 种作用域

singleton单例作用域

无状态的 Bean 使用该作用域。无状态指的是Bean 对象的属性状态不需要更新。

spring 默认使用该作用域。

prototype原型作用域(多例作用域)

每次对该作用域下的 Bean 请求都是创建新的实例。获取及注入 Bean 都是新的对象实例。

通常有状态的 Bean 使用该作用域。

request请求作用域

每次 http 请求都会创建新的 Bean 实例。一次 http 请求和响应共享bean.

适用于 springMVC/spring Web

session会话作用域

每次 session 会话共享一个 Bean.

适用于 springMVC/spring Web

application全局作用域

application. 一个 http servlet context 共享一个 Bean.

适用于 springMVC/spring Web

websocket

限定 Spring WebSocket 中使用

注意:在普通的 Spring 项⽬中只有前两种作用域。

设置作用域

image-20230505155514091

回到之前的代码案例。

可以把 Bean 作用域 设置成 多例作用域。

要在存 Bean 之前就设置作用域。

package com.java.demo.component;
import com.java.demo.entity.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;@Component
public class UserBeans {@Bean@Scope("prototype")public User user(){User user = new User();user.setId(1);user.setName("张三");return user;}
}

image-20230505155749348

//第2种设置方式:
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

image-20230505160249320

给出的提示也验证了前面所说的 spring core 项目 Bean 只能设置 2 种 作用域 :singleton 和 prototype.

@Scope 可以修饰方法,也可以修饰 类。

Spring 执行流程

1.启动容器

image-20230505161715526

加载配置文件。

2.根据配置完成 Bean 初始化。

image-20230505161820391

扫描 base-package 目录底下所有类,找到 加了五大类注解的类

3.把 Bean 存到 spring 容器中。

image-20230505162316032

4.装配 Bean 的属性。(取 Bean)

如果 Bean 对象的属性里包含其他 Bean 对象,可以通过 @Autowired 、@Resource 注入

image-20230505162344677

image-20230505164205120

Bean 的生命周期

1.实例化 Bean, 为 Bean 分配内存空间。

2.设置属性(Bean 装配和注入)

3.Bean初始化

  • 各种通知:如 BeanNameAware、BeanFactoryAware、 ApplicationContextAware 的接口方法;
  • 初始化前置方法。
  • 初始化方法(设置了才会执行):1.注解方式:@PostConstruct 2. xml 方式:init-method 方法
  • 初始化后置方法。

4.使用 Bean

5.销毁 Bean

代码演示

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:content="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><content:component-scan base-package="com.java.demo"></content:component-scan><bean id="beanComponent"class="com.java.demo.component.BeanComponent" init-method="myInit"></bean>
</beans>

ApplicationContext 没有销毁方法。ClassPathXmlApplicationContext 有销毁方法。

package com.java.demo.component;
import org.springframework.beans.factory.BeanNameAware;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;public class BeanComponent implements BeanNameAware {@Overridepublic void setBeanName(String s) {System.out.println("执行了通知 BeanName -> " + s);}/***  XML 方式的初始化方法*/public void myInit(){System.out.println("XML 方式的初始化方法");}@PostConstructpublic void postConstruct(){System.out.println("注解 方式的初始化方法");}public void sayHi(){System.out.println("执行 sayHi() 方法");}@PreDestroypublic void doPreDestroy(){System.out.println("do PreDestroy");}
}
package com.java.demo;
import com.java.demo.component.BeanComponent;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {ClassPathXmlApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");BeanComponent beanComponent =context.getBean("beanComponent",BeanComponent.class);beanComponent.sayHi();context.destroy();}
}

image-20230505185256344

注解初始化方法 优先级于 XML 初始化方法。

设置属性和初始化这两个步骤能颠倒吗?

不能,如果先初始化,在初始化代码中如果调用了依赖的属性的方法,就会报错(此时依赖的属性还没有注入)。

如果我想完善代码,想看到更详细的 Bean 的生命周期流程,能看到其他的通知,初始化前置方法,初始化后置方法。代码如下:

package com.java.demo.component;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;public class BeanComponent implements BeanNameAware , BeanFactoryAware , ApplicationContextAware {@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("执行了通知 ApplicationContext -> " + applicationContext);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("执行了通知 BeanFactory -> " + beanFactory);}@Overridepublic void setBeanName(String s) {System.out.println("执行了通知 BeanName -> " + s);}/***  XML 方式的初始化方法*/public void myInit(){System.out.println("XML 方式的初始化方法");}@PostConstructpublic void postConstruct(){System.out.println("注解 方式的初始化方法");}public void sayHi(){System.out.println("执行 sayHi() 方法");}@PreDestroypublic void doPreDestroy(){System.out.println("do PreDestroy");}}
package com.java.demo;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("postProcessBeforeInitialization " + beanName + " 调用初始化前置方法");return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("postProcessAfterInitialization " + beanName + " 调用初始化后置方法");return bean;}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:content="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><content:component-scan base-package="com.java.demo"></content:component-scan><bean id="beanComponent"class="com.java.demo.component.BeanComponent" init-method="myInit" ></bean><bean id="myBeanPostProcessor"class="com.java.demo.MyBeanPostProcessor"></bean>
</beans>
package com.java.demo;
import com.java.demo.component.BeanComponent;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {ClassPathXmlApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");BeanComponent beanComponent =context.getBean("beanComponent",BeanComponent.class);beanComponent.sayHi();context.destroy();//context.close();}
}

image-20230505195759642

http://www.yayakq.cn/news/719830/

相关文章:

  • 深圳建设集团网站官网网站开发要注意的问题
  • 南山网站seo如果给公司网站做网络广告
  • 二级网站收录专做polo衫的网站
  • 网站建设公司咨网站代备案管理系统
  • 怎么做网站跳转桂林尚品网络科技有限公司
  • 世纪佳缘网站开发语言开发个app的公司在哪
  • 河北婚庆网站建设定制橡胶塑料制品公司网站建设
  • 福建:网站建设代理网页 在线
  • 友联建设集团官方网站南京在线网站制作
  • 网站建设收费标准行情做网站建设月收入多少
  • 房地产网站建设策划方案最好网站开发公司电话
  • 海珠建设网站开发网站需要什么硬件
  • 无锡网站排名优化广东卫视你会怎么做网站
  • 网站在线交谈木马网站怎么做
  • 西安有一个电影他要拉投资做网站陕西建设集团招聘信息网站
  • 网站建设界面建议大专网络营销专业好不好
  • 网站推广的渠道有哪些域名的价格
  • 做网站有哪些类型的制作网站学什么专业
  • 一个外国人做汉字网站网站开发自学
  • 网站推广服务器怎么选黑龙江省建设部网站
  • 二级学院网站建设wordpress时间提前
  • 昆明市建设局官方网站软件开发设计文档示例
  • 个人如果做网站赚钱上海市建设工程信息网
  • 手机网站开发教程视频网站商城建设合同范本
  • 如何做网站 seo企业目录
  • 告诉搜索引擎网站建设中百度怎么推广广告
  • 网站建设后如何修改用瀑布流做的美食网站
  • 自助建站平台源码丰县徐州网站开发
  • 房产信息查询系统官方网站凡客衬衫官方网站
  • 百元做网站手机商务彩铃制作教程