BeanUtils.getBean
时间: 2024-06-15 12:05:51 浏览: 144
BeanUtils.getBean是一个常用的工具类方法,它是Apache Commons BeanUtils库中的一个方法。该方法用于获取指定名称的Java Bean对象。
BeanUtils.getBean方法的使用方式如下:
```java
Object bean = BeanUtils.getBean(String name);
```
其中,name参数表示要获取的Java Bean对象的名称。
该方法的实现原理是通过反射机制来实例化和获取Java Bean对象。它会根据指定的名称在当前的上下文中查找对应的Java Bean对象,并返回该对象。
使用BeanUtils.getBean方法可以方便地获取已经注册或者已经存在的Java Bean对象,避免了手动实例化和管理对象的繁琐过程。
相关问题
解释这段代码 public static User getSubject() { User user = (User) SecurityUtils.getSubject().getPrincipal(); // 初始化延迟加载的部门信息 if (user != null && !Hibernate.isInitialized(user.getDept())) { try { Hibernate.initialize(user.getDept()); } catch (LazyInitializationException e) { UserService userService = SpringContextUtil.getBean(UserService.class); User reload = userService.getById(user.getId()); Hibernate.initialize(reload.getDept()); BeanUtils.copyProperties(reload, user, "roles"); } } return user; }
这段代码是一个静态方法,返回一个 User 对象,表示当前登录用户。这里使用了 Shiro 框架的 SecurityUtils 工具类获取当前登录用户的信息,其中 getPrincipal() 方法返回的是 Object 类型,需要强制类型转换成 User 类型。接下来,代码对用户的部门信息进行处理。如果用户不为 null,而且用户的部门信息是延迟加载的,那么就使用 Hibernate.initialize() 方法将其初始化。如果在初始化部门信息时发生了 LazyInitializationException 异常,说明该用户的部门信息没有被正确加载,那么就需要重新查询用户信息并初始化部门信息,最后将查询出的用户信息复制到原来的用户对象中(排除 roles 属性)。最终返回处理后的用户对象。
@Data @AllArgsConstructor @NoArgsConstructor @Builder @Table(name = "advert") public class Advert { /** * 主键 */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @ApiModelProperty(value = "广告唯一id") private Integer id; /** * 广告名称 */ @ApiModelProperty(value = "广告名称") @NotBlank(message = "广告名称不可为空", groups = {AddGroup.class, UpdateGroup.class}) private String name; /** * 广告位置ID */ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "position_id") private AdPosition position; /** * 广告图片ID */ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "media_id") private MediaFile media; /** * 开始日期 */ @Column(name = "start_date") @ApiModelProperty(value = "开始日期") @NotNull(message = "开始日期不可为空", groups = {AddGroup.class}) private Date startDate; /** * 结束日期 */ @Column(name = "end_date") @ApiModelProperty(value = "结束日期") @NotNull(message = "结束日期不可为空", groups = {AddGroup.class}) private Date endDate; /** * 广告链接 */ @ApiModelProperty(value = "广告链接") @NotBlank(message = "广告链接不可为空", groups = {AddGroup.class}) private String link; /** * 广告状态:0:未启用,1:已启用,2:已结束 */ @ApiModelProperty(value = "广告状态") @NotNull(message = "广告状态不可为空", groups = {UpdateGroup.class}) private Integer status; /** * 创建时间 */ @Column(name = "create_time") @ApiModelProperty(value = "创建时间") private Date createTime; /** * 更新时间 */ @Column(name = "update_time") @ApiModelProperty(value = "更新时间") private Date updateTime; },这个类进行添加和修改时,因为有大量重复代码,如何简化代码并避免并发问题
可以使用Lombok提供的@Builder注解简化代码,并且使用@Transactional注解来实现数据库的事务控制,避免并发问题。简化后的代码如下:
```
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Table(name = "advert")
public class Advert {
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@ApiModelProperty(value = "广告唯一id")
private Integer id;
/** 广告名称 */
@ApiModelProperty(value = "广告名称")
@NotBlank(message = "广告名称不可为空", groups = {AddGroup.class, UpdateGroup.class})
private String name;
/** 广告位置ID */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "position_id")
private AdPosition position;
/** 广告图片ID */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "media_id")
private MediaFile media;
/** 开始日期 */
@Column(name = "start_date")
@ApiModelProperty(value = "开始日期")
@NotNull(message = "开始日期不可为空", groups = {AddGroup.class})
private Date startDate;
/** 结束日期 */
@Column(name = "end_date")
@ApiModelProperty(value = "结束日期")
@NotNull(message = "结束日期不可为空", groups = {AddGroup.class})
private Date endDate;
/** 广告链接 */
@ApiModelProperty(value = "广告链接")
@NotBlank(message = "广告链接不可为空", groups = {AddGroup.class})
private String link;
/** 广告状态:0:未启用,1:已启用,2:已结束 */
@ApiModelProperty(value = "广告状态")
@NotNull(message = "广告状态不可为空", groups = {UpdateGroup.class})
private Integer status;
/** 创建时间 */
@Column(name = "create_time")
@ApiModelProperty(value = "创建时间")
private Date createTime;
/** 更新时间 */
@Column(name = "update_time")
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**
* 保存或更新广告
*/
@Transactional(rollbackFor = Exception.class)
public void saveOrUpdate() {
AdvertRepository advertRepository = SpringContextUtil.getBean(AdvertRepository.class);
if (this.getId() == null) {
// 新增广告
this.setCreateTime(new Date());
advertRepository.save(this);
} else {
// 更新广告
Advert oldAdvert = advertRepository.findById(this.getId()).orElse(null);
if (oldAdvert != null) {
BeanUtils.copyProperties(this, oldAdvert, "id", "createTime");
oldAdvert.setUpdateTime(new Date());
advertRepository.save(oldAdvert);
}
}
}
}
```
这里使用了Spring的@Transactional注解来实现事务控制,同时使用了Spring的工具类SpringContextUtil来获取AdvertRepository的实例。这样,我们就可以在Advert实体类中调用saveOrUpdate方法来进行保存或更新操作,避免了重复代码的出现,并且确保了并发安全。
阅读全文