Spring基础知识总结(二):IOC案例、配置 与Spring 整合Junit

Spring详解,代码事例,IOC,AOP,事务。整合MyBatis,JUnit Spring详解,代码事例,IOC,AOP,事务。整合MyBatis,JUnit。spring调的是无参构造方法,public ,private都可以掉到(反射)无参构造方法如果不存在,将抛出异常BeanCreationException,实例工厂,使用 FactoryBean 实例化,bean 生命周期 阅读详情

一:案例:使用 spring 的 IoC 的实现账户的CRUD

1.1 需求和技术要求

1.1.1 需求

实现账户的 CRUD 操作

1.1.2 技术要求

使用 spring 的 IoC 实现对象的管理
使用 DBAssit 作为持久层解决方案
使用 c3p0 数据源

1.2 环境搭建

1.2.1 拷贝 jar 包

在这里插入图片描述

1.2.2 创建数据库和编写实体类

create table account(
id int primary key auto_increment,
name varchar(40),
money float
)character set utf8 collate utf8_general_ci;
insert into account(name,money) values('aaa',1000);
insert into account(name,money) values('bbb',1000);
insert into account(name,money) values('ccc',1000);
/**
* 账户的实体类
*/
public class Account implements Serializable {
	private Integer id;
	private String name;
	private Float money;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Float getMoney() {
		return money;
	}
	public void setMoney(Float money) {
		this.money = money;
	}
}

1.2.3 编写持久层代码

/**
* 账户的持久层接口
*/
public interface IAccountDao {
	/**
	* 保存
	* @param account
	*/
	void save(Account account);
	/**
	* 更新
	* @param account
	*/
	void update(Account account);
	/**
	* 删除
	* @param accountId
	*/
	void delete(Integer accountId);
	/**
	* 根据 id 查询
	* @param accountId
	* @return
	*/
	Account findById(Integer accountId);
	/**
	* 查询所有
	* @return
	*/
	List<Account> findAll();
}
/**
* 账户的持久层实现类
*/
public class AccountDaoImpl implements IAccountDao {
	private DBAssit dbAssit;
	public void setDbAssit(DBAssit dbAssit) {
		this.dbAssit = dbAssit;
	}
	@Override
	public void save(Account account) {
		dbAssit.update("insert into
		account(name,money)values(?,?)",account.getName(),account.getMoney());
	}
	@Override
	public void update(Account account) {
		dbAssit.update("update account set name=?,money=? where
		id=?",account.getName(),account.getMoney(),account.getId());
	}
	@Override
	public void delete(Integer accountId) {
		dbAssit.update("delete from account where id=?",accountId);
	}
	@Override
	public Account findById(Integer accountId) {
		return dbAssit.query("select * from account where id=?",new
		BeanHandler<Account>(Account.class),accountId);
	}
	@Override
	public List<Account> findAll() {
		return dbAssit.query("select * from account where id=?",new
		BeanListHandler<Account>(Account.class));
	}
}

1.2.4 编写业务层代码

/**
* 账户的业务层接口
*/
public interface IAccountService {
	/**
	* 保存账户
	* @param account
	*/
	void saveAccount(Account account);
	/**
	* 更新账户
	* @param account
	*/
	void updateAccount(Account account);
	/**
	* 删除账户
	* @param account
	*/
	void deleteAccount(Integer accountId);
	/**
	* 根据 id 查询账户
	* @param accountId
	* @return
	*/
	Account findAccountById(Integer accountId);
	/**
	* 查询所有账户
	* @return
	*/
	List<Account> findAllAccount();
}
/**
* 账户的业务层实现类
* @author 黑马程序员
* @Company http://www.ithiema.com
* @Version 1.0
*/
public class AccountServiceImpl implements IAccountService {
	private IAccountDao accountDao;
	public void setAccountDao(IAccountDao accountDao) {
		this.accountDao = accountDao;
	}
	@Override
	public void saveAccount(Account account) {
		accountDao.save(account);
	}
	@Override
	public void updateAccount(Account account) {
		accountDao.update(account);
	}
	@Override
	public void deleteAccount(Integer accountId) {
		accountDao.delete(accountId);
	}
	@Override
	public Account findAccountById(Integer accountId) {
		return accountDao.findById(accountId);
	}
	@Override
	public List<Account> findAllAccount() {
		return accountDao.findAll();
	}
}

1.2.5 创建并编写配置文件

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

1.3 配置步骤

1.3.1 配置对象

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd">
	
<!-- 配置 service -->
	<bean id="accountService"
	 class="com.itheima.service.impl.AccountServiceImpl">
		<property name="accountDao" ref="accountDao"></property>
	</bean>
	<!-- 配置 dao -->
	<bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl">
		<property name="dbAssit" ref="dbAssit"></property>
	</bean>
	<!-- 配置 dbAssit 此处我们只注入了数据源,表明每条语句独立事务-->
	<bean id="dbAssit" class="com.itheima.dbassit.DBAssit">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 配置数据源 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
		<property name="jdbcUrl" value="jdbc:mysql:///spring_day02"></property>
		<property name="user" value="root"></property>
		<property name="password" value="1234"></property>
	</bean>
</beans>

1.4 测试案例

1.4.1 测试类代码

/**
* 测试类
*/
public class AccountServiceTest {
	/**
	* 测试保存
	*/
	@Test
	public void testSaveAccount() {
		Account account = new Account();
		account.setName("黑马程序员");
		account.setMoney(100000f);
		ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
		IAccountService as = ac.getBean("accountService",IAccountService.class);
		as.saveAccount(account);
	}
	/**
	* 测试查询一个
	*/
	@Test
	public void testFindAccountById() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
		IAccountService as = ac.getBean("accountService",IAccountService.class);
		Account account = as.findAccountById(1);
		System.out.println(account);
	}
	/**
	* 测试更新
	*/
	@Test
	public void testUpdateAccount() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
		IAccountService as = ac.getBean("accountService",IAccountService.class);
		Account account = as.findAccountById(1);
		account.setMoney(20301050f);
		as.updateAccount(account);
	}
	/**
	* 测试删除
	*/
	@Test
	public void testDeleteAccount() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
		IAccountService as = ac.getBean("accountService",IAccountService.class);
		as.deleteAccount(1);
	}
	/**
	* 测试查询所有
	*/
	@Test
	public void testFindAllAccount() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
		IAccountService as = ac.getBean("accountService",IAccountService.class);
		List<Account> list = as.findAllAccount();
		for(Account account : list) {
			System.out.println(account);
		}
	}
}

1.4.2 分析测试了中的问题

通过上面的测试类,我们可以看出,每个测试方法都重新获取了一次 spring 的核心容器,造成了不必要的重复代码,增加了我们开发的工作量。这种情况,在开发中应该避免发生。或许我们可以把容器的获取定义到类中去。例如:

/**
* 测试类
*/
public class AccountServiceTest {
		private ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
		private IAccountService as = ac.getBean("accountService",IAccountService.class);
}

这种方式虽然能解决问题,但是扔需要我们自己写代码来获取容器。
而我们可以通过下面的内容在测试时直接编写测试方法,而不需要手动编码来获取容器。

二:基于注解的 IOC 配置

2.1明确: 写在最前

学习基于注解的 IoC 配置,首先需要有一个认知,即注解配置和 xml 配置要实现的功能都是一样的,都是要降低程序间的耦合。只是配置的形式不一样。关于实际的开发中到底使用xml还是注解,每家公司有着不同的使用习惯。所以这两种配置方式我们都需要掌握。下面将使用上面编写的案例,把 spring 的 xml 配置内容改为使用注解逐步实现

2.2环境搭建

2.2.1 第一步:拷贝必备 jar 包到工程的 lib 目录。

注意:在基于注解的配置中,我们还要多拷贝一个 aop 的 jar 包。如下图:
在这里插入图片描述

2.2.2 第二步:使用@Component 注解配置管理的资源

/**
* 账户的业务层实现类
*/
@Component("accountService")
public class AccountServiceImpl implements IAccountService {
	private IAccountDao accountDao;
	public void setAccountDao(IAccountDao accountDao) {
		this.accountDao = accountDao;
	}
}

	/**
	* 账户的持久层实现类
	*/
	@Component("accountDao")
	public class AccountDaoImpl implements IAccountDao {
		private DBAssit dbAssit;
}

注意:
1、 当我们使用注解注入时, set 方法不用写

2.2.3 第三步: 创建 spring 的 xml 配置文件并开启对注解的支持

在这里插入图片描述
注意:
基于注解整合时,导入约束时需要多导入一个 context 名称空间下的约束。
由于我们使用了注解配置,此时不能在继承 JdbcDaoSupport,需要自己配置一个 JdbcTemplate

<?xml version="1.0" encoding="UTF-8"?>
	<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context.xsd">
	
	<!-- 告知 spring 创建容器时要扫描的包 -->
	<context:component-scan base-package="com.itheima"></context:component-scan>
	<!-- 配置 dbAssit -->
	<bean id="dbAssit" class="com.itheima.dbassit.DBAssit">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 配置数据源 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
		<property name="jdbcUrl" value="jdbc:mysql:///spring_day02"></property>
		<property name="user" value="root"></property>
		<property name="password" value="1234"></property>
	</bean>
</beans>

2.3常用注解

2.3.1 用于创建对象的

相当于:

 <bean id="" class="">
2.3.1.1 @Component

作用:
把资源让 spring 来管理。相当于在 xml 中配置一个 bean。
属性:
value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写。

2.3.1.2 @Controller @Service @Repository

他们三个注解都是针对一个的衍生注解,他们的作用及属性都是一模一样的。
他们只不过是提供了更加明确的语义化。

  • @Controller: 一般用于表现层的注解。
  • @Service: 一般用于业务层的注解。
  • @Repository: 一般用于持久层的注解。

细节:如果注解中有且只有一个属性要赋值时,且名称是 value, value 在赋值是可以不写。

2.3.2 用于注入数据的

相当于:

<property name="" ref="">
<property name="" value="">
2.3.2.1 @Autowired

作用:
自动按照类型注入。当使用注解注入属性时, set 方法可以省略。它只能注入其他 bean 类型。当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到就报错。

2.3.2.2 @Qualifier

作用:
在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和@Autowire 一起使用;但是给方法参数注入时,可以独立使用。
属性:
value:指定 bean 的 id。

2.3.2.3 @Resource

作用:
直接按照 Bean 的 id 注入。它也只能注入其他 bean 类型。
属性:
name:指定 bean 的 id。

2.3.2.4 @Value

作用:
注入基本数据类型和 String 类型数据的
属性:
value:用于指定值

2.3.3 用于改变作用范围的:

相当于: <bean id="" class="" scope="">

2.3.3.1 @Scope

作用:
指定 bean 的作用范围。
属性:
value:指定范围的值。
取值: singleton prototype request session globalsession

2.3.4 和生命周期相关的: (了解)

相当于:

<bean id="" class="" init-method="" destroy-method="" />
2.3.4.1 @PostConstruct

作用:
用于指定初始化方法。

2.3.4.2 @PreDestroy

作用:
用于指定销毁方法。

2.3.5 关于 Spring 注解和 XML 的选择问题

注解的优势:
配置简单,维护方便(我们找到类,就相当于找到了对应的配置)。
XML 的优势:
修改时,不用改源码。不涉及重新编译和部署。
Spring 管理 Bean 方式的比较:
在这里插入图片描述

2.4spring 管理对象细节

基于注解的 spring IoC 配置中, bean 对象的特点和基于 XML 配置是一模一样的。

2.5spring 的纯注解配置

写到此处,基于注解的 IoC 配置已经完成,但是大家都发现了一个问题:我们依然离不开 spring 的 xml 配置文件,那么能不能不写这个 bean.xml,所有配置都用注解来实现呢?当然需要主义的是,我们选择哪种配置的原则是简化开发和配置方便,而非追求某种技术。

2.5.1 待改造的问题

我们发现,之所以我们现在离不开 xml 配置文件,是因为我们有一句很关键的配置:

<!-- 告知spring框架在,读取配置文件,创建容器时,扫描注解,依据注解创建对象,并存入容器中 -->
<context:component-scan base-package="com.itheima"></context:component-scan>
如果他要也能用注解配置,那么我们就离脱离 xml 文件又进了一步。
另外,数据源和 JdbcTemplate 的配置也需要靠注解来实现。
<!-- 配置 dbAssit -->
<bean id="dbAssit" class="com.itheima.dbassit.DBAssit">
	<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
	<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
	<property name="jdbcUrl" value="jdbc:mysql:///spring_day02"></property>
	<property name="user" value="root"></property>
	<property name="password" value="1234"></property>
</bean>

2.5.2 新注解说明

2.5.2.1 @Configuration

作用:
用于指定当前类是一个 spring 配置类, 当创建容器时会从该类上加载注解。 获取容器时需要使用AnnotationApplicationContext(有@Configuration 注解的类.class)。
属性:
value:用于指定配置类的字节码

/**
* spring 的配置类,相当于 bean.xml 文件
*/
@Configuration
public class SpringConfiguration {
}

注意:
我们已经把配置文件用类来代替了, 但是如何配置创建容器时要扫描的包呢?
请看下一个注解

2.5.2.2 @ComponentScan

作用:
用于指定 spring 在初始化容器时要扫描的包。 作用和在 spring 的 xml 配置文件中的:<context:component-scan base-package=“com.itheima”/>是一样的。
属性:
basePackages:用于指定要扫描的包。和该注解中的 value 属性作用一样。
示例代码:

/**
* spring 的配置类,相当于 bean.xml 文件
*/
@Configuration
@ComponentScan("com.itheima")
public class SpringConfiguration {
}

注意:
我们已经配置好了要扫描的包,但是数据源和 JdbcTemplate 对象如何从配置文件中移除呢?请看下一个注解

2.5.2.3 @Bean

作用:
该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。
属性:
name:给当前@Bean 注解方法创建的对象指定一个名称(即 bean 的 id)。
示例代码:

/**
* 连接数据库的配置类
*/
public class JdbcConfig {
	/**
	* 创建一个数据源,并存入 spring 容器中
	* @return
	*/
	@Bean(name="dataSource")
	public DataSource createDataSource() {
		try {
			ComboPooledDataSource ds = new ComboPooledDataSource();
			ds.setUser("root");
			ds.setPassword("1234");
			ds.setDriverClass("com.mysql.jdbc.Driver");
			ds.setJdbcUrl("jdbc:mysql:///spring_day02");
			return ds;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	* 创建一个 DBAssit,并且也存入 spring 容器中
	* @param dataSource
	* @return
	*/
	@Bean(name="dbAssit")
	public DBAssit createDBAssit(DataSource dataSource) {
		return new DBAssit(dataSource);
	}
}

注意:
我们已经把数据源和 DBAssit 从配置文件中移除了,此时可以删除 bean.xml 了。
但是由于没有了配置文件,创建数据源的配置又都写死在类中了。如何把它们配置出来呢?请看下一个注解

2.5.2.4 @PropertySource

作用:
用于加载.properties 文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties 配置文件中,就可以使用此注解指定 properties 配置文件的位置。
属性:
value[]:用于指定 properties 文件位置。如果是在类路径下,需要写上 classpath:

示例代码:

/**
* 连接数据库的配置类
*/
public class JdbcConfig {
	@Value("${jdbc.driver}")
	private String driver;
	
	@Value("${jdbc.url}")
	private String url;
	
	@Value("${jdbc.username}")
	private String username;
	
	@Value("${jdbc.password}")
	private String password;
	
	/**
	* 创建一个数据源,并存入 spring 容器中
	* @return
	*/
	@Bean(name="dataSource")
	public DataSource createDataSource() {
		try{
			ComboPooledDataSource ds = new ComboPooledDataSource();
			ds.setDriverClass(driver);
			ds.setJdbcUrl(url);
			ds.setUser(username);
			ds.setPassword(password);
			return ds;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}

jdbc.properties 文件:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/day44_ee247_spring
jdbc.username=root
jdbc.password=1234

注意:
此时我们已经有了两个配置类,但是他们还没有关系。如何建立他们的关系呢?
请看下一个注解。

2.5.2.5 @Import

作用:
用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration 注解。 当然,写上也没问题。
属性:
value[]:用于指定其他配置类的字节码。
示例代码:

@Configuration
@ComponentScan(basePackages = "com.itheima.spring")
@Import({ JdbcConfig.class})
public class SpringConfiguration {
}

@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig{
}

注意:
我们已经把要配置的都配置好了,但是新的问题产生了,由于没有配置文件了,如何获取容器呢?

2.5.2.6 通过注解获取容器:
ApplicationContext ac =
new AnnotationConfigApplicationContext(SpringConfiguration.class);

2.5.3 工程结构图

在这里插入图片描述

三: Spring 整合 Junit[掌握]

3.1测试类中的问题和解决思路

3.1.1 问题

在测试类中,每个测试方法都有以下两行代码:

ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
IAccountService as = ac.getBean("accountService",IAccountService.class);

这两行代码的作用是获取容器,如果不写的话,直接会提示空指针异常。所以又不能轻易删掉。

3.1.2 解决思路分析

针对上述问题,我们需要的是程序能自动帮我们创建容器。一旦程序能自动为我们创建 spring 容器,我们就无须手动创建了,问题也就解决了。
我们都知道, junit 单元测试的原理,但显然, junit 是无法实现的,因为它自
己都无法知晓我们是否使用了 spring 框架,更不用说帮我们创建 spring 容器了。不过好在, junit 给我们暴露了一个注解,可以让我们替换掉它的运行器。这时,我们需要依靠 spring 框架,因为它提供了一个运行器,可以读取配置文件(或注解)来创建容器。我们只需要告诉它配置文件在哪就行了。

3.2配置步骤

3.2.1 第一步:拷贝整合 junit 的必备 jar 包到 lib 目录

此处需要注意的是,导入 jar 包时,需要导入一个 spring 中 aop 的 jar 包。
在这里插入图片描述

3.2.2 第二步:使用@RunWith 注解替换原有运行器

/**
* 测试类
*/
@RunWith(SpringJUnit4ClassRunner.class)
public class AccountServiceTest {
}

3.2.3 第三步:使用@ContextConfiguration 指定 spring 配置文件的位置

/**
* 测试类
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"classpath:bean.xml"})
public class AccountServiceTest {
}

@ContextConfiguration 注解:
locations 属性: 用于指定配置文件的位置。如果是类路径下,需要用 classpath:表明
classes 属性: 用于指定注解的类。当不使用 xml 配置时,需要用此属性指定注解类的位置。

3.2.4 第四步:使用@Autowired 给测试类中的变量注入数据

/**
 * 测试类
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"classpath:bean.xml"})
public class AccountServiceTest {
	@Autowired
	private IAccountService as ;
}

3.3为什么不把测试类配到 xml 中

在解释这个问题之前,首先要知道配到 XML 中能不能用呢?
答案是肯定的,没问题,可以使用。
那么为什么不采用配置到 xml 中的方式呢?
原因如下:

  • 第一:当我们在 xml 中配置了一个 bean, spring 加载配置文件创建容器时,就会创建对象。
  • 第二:测试类只是我们在测试功能时使用,而在项目中它并不参与程序逻辑,也不会解决需求上的问题,所以创建完了,并没有使用。那么存在容器中就会造成资源的浪费。
  • 所以,基于以上两点,我们不应该把测试配置到 xml 文件中。
Spring整合Junit框架 这篇文章给大家详细的介绍了Spring整合Junit框架是如何实现的。并给大家演示了Spring整合Junit4还有Junit5单元测试框架的具体用法,这两种方式在今后的学习和工作中都会使用到,所以各位小伙伴们一定要好好掌握并学会使用 阅读详情

相关推荐

Spring整合MyBatis、Spring整合JUnit4(Spring纯注解开发完结篇)

文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习。

KJ.JK 1万+

@Qualifier注解作用

@Qualifier 注解作用就是为了给Bean打上一个标记,用来和其他的Bean做区分,代码示例: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201021002048346.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTMwMDQzNw==,size_16,color_FFFFF

weixin_41300437的博客 1万+

Imatest-Dot Pattern

本文介绍了DotPattern模块测试方法,用于评估相机拍摄点阵图的表现。测试主要关注两点:色彩准确性(是否存在彩色噪点和杂边)和摩尔纹现象。测试步骤包括导入图片、选择分析区域、微调ROI、选择点状图类型和分析保存结果。测试结果包含横向色差、光学畸变和SMIATV畸变等数据,其中0.115%的色差值和0.004度的网格旋转角度表明相机表现良好,但-10.4%的SMIATV畸变显示存在明显桶形畸变。文章还提供了各项指标的具体解读标准。

weixin_64706696的博客 1351

spring中@Qualifier注解的使用

@Qualifier注解的使用 该注解可以使用在类上、属性上、参数上、方法上》

m0_62639693的博客 1万+

腾讯混元3D世界模型2.0实战:从AI生成到Unity/UE引擎集成全指南

生成式AI正在重塑3D内容创作流程,其核心原理是通过大语言模型理解自然语言描述,并驱动多阶段生成流水线自动创建3D资产与场景。这项技术为游戏开发、虚拟仿真和数字孪生领域带来了革命性的效率提升,能够将传统需要数周的美术协作流程压缩至几分钟。在实际应用中,开发者需要掌握本地环境部署、模型推理优化以及生成资产与主流游戏引擎的集成工作流。本文以腾讯开源的混元3D世界模型为例,详细解析如何将AI生成的场景通过插件高效导入Unity和Unreal Engine,并针对光照烘焙、材质调整、性能优化等工程实践问题提供解决方

cnracht8153的博客 1395

R语言的下载、安装及环境配置(Rstudio&VSCode)

R for Windows是一个免费的用于统计计算和统计制图的优秀工具,是R语言开发工具。它拥有数据存储和处理系统、数组运算工具(其向量、矩阵运算方面功能尤其强大)、完整连贯的统计分析工具、优秀的统计制图等功能。提供的图形界面,可以在其中访问控制台、创建脚本或安装其他软件包。

zegeai的博客 2万+

spring注解@Qualifier的详细用法

12345678@Target@Retention@Inherited@Qualifierpublic@interfaceFK {}注意:该自定义注解上添加有@Qualifier注解。}@Resource@FKprivate运行:注入了一个Date Bean。

qq_41623204的博客 1452

【知识图谱】一文看懂知识图谱的搭建实践与科普教程(5万字完结篇)

所有可能的实体对:(“Mate40”,“华为”), (“Mate40”,“手机”), (“华为”,“手机”)。送入关系模型分类,预期输出 (“Mate40”,“华为”): 品牌, (“Mate40”,“手机”): 属于类别, (“华为”,“手机”): 无关系。,定义了图谱中概念和关系的类型层次结构,相当于知识图谱的“纲领”和“schema”。训练完成后,当模型看到新的句子,比如“苹果的MacBook笔记本性能强大”,识别出实体“苹果”(品牌)和“MacBook”(产品)后,就能正确输出关系“品牌”。

weixin_41645791的博客 2614

简述@Qualifier 注解的作用

Qualifier 注解是 Spring 框架中的一个重要注解,主要用于解决自动装配(@Autowired)时遇到的多个候选 Bean 的歧义问题。具体来说,当有多个相同类型的 Bean 存在时,Spring 无法确定应该注入哪一个 Bean,这时就可以使用 @Qualifier 来指定具体的 Bean。总结来说,@Qualifier 注解的作用是在存在多个相同类型的 Bean 时,帮助 Spring 容器选择正确的 Bean 进行依赖注入,从而避免了歧义并提高了代码的可读性和灵活性。

liangyongyx的专栏 1094

基于Arduino 的 FM 调频收音机

这是一个基于 Arduino 的开源的收音机项目,它具备一台标准收音机的全部功能,从控制部分到外壳都可以自己 DIY。在项目中,我们将介绍让 FM 收音机调谐器的 RDA5807 模块与 I2C 协议进行通信的方法,整个过程只需要两根线就可以与 IC 通信,接线非常简单。3D 打印的外壳也非常简洁。总之,是个非常简单和实用的项目,来试试吧!

ByteBox的博客 1642

AI驱动的iOS逆向工程自动化:14阶段工作流与Ghidra集成实践

逆向工程是软件安全分析的核心技术,通过反汇编、调试等手段解析程序内部逻辑与数据流。其原理在于将编译后的二进制代码还原为可理解的逻辑结构,从而发现潜在漏洞或理解软件行为。在移动安全领域,iOS逆向工程具有重要技术价值,能够用于安全审计、漏洞挖掘与恶意软件分析。传统iOS逆向依赖ipsw、class-dump、Frida等工具链组合,存在学习曲线陡峭与流程碎片化问题。本文介绍的ios-reverse-skills项目创新性地将14阶段逆向工程方法论封装为AI可调用的标准化脚本集,通过Ghidra脚本实现Swif

weixin_27268733的博客 434

@Qualifier注解的作用

Qualifier注解在Spring框架中的作用主要是用来解决自动装配时可能出现的歧义性,也就是当有多个类型兼容的Bean可以注入到同一位置时,通过指定@Qualifier来明确注入哪一个Bean。在使用自动装配(如@Autowired)时,如果Spring容器中存在多个同类型的Bean,Spring将无法决定使用哪一个Bean进行装配,因而会抛出异常。此时,@Qualifier注解就变得非常有用,它可以和@Autowired一起使用,明确指示Spring容器注入哪个具体的Bean。

java永无止境! 2589

【scratch音乐课】天空之城:音符与节拍、消息与链表

scratch是一个非常小巧的青少年编程工具,自带程序编写语句,积木式语句非常直观、易用,可创作数学、科学、音乐、绘画等方面作品。本文用scratch“演奏”一首大家非常熟悉的《天空之城》,并向大家介绍一些基本乐理知识,以及scratch中消息、链表的使用。

★·°立芯;︶︵︶ 1万+

spring与junit的整合

前言 ​ 在我们把spring的上下文配置都配置好后,要想进行测试,代码如下: public class AccoutDaoTest { @Resource(name = "accountDao") private AccountDao accountDao; @Test public void test01() { System.out.println(accountDao);//null } } 输出结果为null? 这是为什么呢,我们不是在

qq_1243443888的博客 1260

Windows 11 安装 Miniforge,配置国内源

本文详细介绍了在 Windows 11 系统中安装 Miniforge 的完整流程,包括下载、安装选项设置、配置国内镜像源(如清华大学源)以加速包管理,并启用 mamba 提升依赖解析与安装速度。同时涵盖 conda 与 mamba 的基本使用验证、PowerShell 初始化及环境提示符优化,帮助用户快速搭建高效、开源、免费的 Python 科学计算环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 4522

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spring注解IoC与JUnit整合实战

本项目展示了Spring框架中基于注解的IoC(控制反转)实现方式,以及如何将Spring与JUnit单元测试框架整合使用。基于注解的Bean定义与依赖注入Java配置类替代XML配置多实现类的依赖解决策略Spring与JUnit的整合测试。

qq_52331401的博客 763

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit

IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit

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

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Spring6笔记(概述、IOC、AOP、事务、Spring整合Junit)

Spring6笔记(概述、IOC、AOP、事务、Spring整合Junit)

LLM | Agent | RAG | Java 2831

Spring框架---IOC注解方式,Spring整合Junit单元测试

博主所使用的软件版本为idea 2017jdk版本 1.8.0maven版本 3.5.4Spring框架开发程序的方式编写service和dao的类,持久层选择使用原始的JDBC的程序,连接池选择的是Druid连接池,演示代码,来理解Spring框架开发程序的方式。

jlihan的博客 929

【spring】配置类和整合Junit

在spring中,虽然可以用@Component把我们想要放入的bean所属的类放入ioc容器中,但是这个类局限于自己自定义的类,但是如果时其他已经被封装好的实现的类,我们就不能这么干了,就只能老老实实用xml文件来。其实还是有其他方法的,它就是java的配置类。那至于什么是配置类呢,它的作用其实和xml文件的作用是差不多的,都是用来管理bean的。首先来介绍它的作用就是用来指定当前的类是一个配置类。其实讲到这就够了,至于怎么获取bean后面再来讲。接着我们来讲一下。

L3526581402的博客 1534

Spring学习day02(基于注解的IOC配置、Spring整合Junit)

前言 建议先看上篇文章(Spring学习day01)点击访问 首先复习一下之前的Spring基于xml的IOC配置(通过一个案例),这里需要说明的是:spring的IOC并不能实现持久层的操作,而是能够将应用程序的配置和依赖性规范与实际的应用程序代码分开(控制反转),通过IOC将持久层的操作进行解耦,能优化整个操作。 一、案例:使用spring的IoC的实现账户的CRUD 通过spring的IOC...

qq_34504626的博客 344

Spring 从入门到精通系列 08 —— 纯注解方式实现 IOC 案例与 Junit 整合

本文针对Spring使用纯注解开发,并对 Spring 整合 Junit 做了一定的分析。 文章目录一、 spring中的新注解1.1 Configuration1.2 ComponentScan1.3 Bean1.4 Import1.5 PropertySource二、Spring 整合 Junit (了解)2.1 问题分析2.2 Spring 整合 junit配置 一、 spring中的新注解 1.1 Configuration 作用: 指定当前类是一个配置类 细节: 当配置类作为 Ann

秀岩的博客 321

Spring(四)基于xml的IoC案例 && 使用注解进行改造 && Spring整合JUnit

目录基于xml的IoC案例一、准备1. 新建一个maven工程:2. 导入坐标3. 建立数据库,准备数据4. 创建账户实体类 基于xml的IoC案例 一、准备 1. 新建一个maven工程: 2. 导入坐标 pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/

刘伟佳的博客 461

Spring学习笔记第二天,Spring基于xml的IOC和注解的IOC以及IOC的案例

经过了第一天的学习,我们对spring框架应该有了一定的了解。对于使用xml配置的方式也应该会使用了。今天我们就来学习spring基于注解的IOC以及IOC的案例。 1 Spring中IOC的常用注解 在我们上一天的学习中我们使用的是xml对ioc进行配置,配置的方式如下 <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl" scope="" init-method="" destroy-method

Code_Boy_Code的博客 711

[Spring-02]IOC使用和Spring整合Junit

1、使用spring的IOC实现账户CRUD                               2、 基于注解的IOC配置   注解配置和 xml 配置要实现的功能都是一样的,都是要降低程序间的耦合。只是配置的形式不一样。关于实际的开发中到底使用xml还是注解,每家公司有着不同的使用习惯。所以这两种配置方式我们都需要掌握。 2.1 环境搭建 2.1.1 maven导入spring坐标 &...

学哥斌的博客 260

【Spring】Spring复习之基于注解的IOC和JUnit整合

一、基于注解的IOC配置 常用注解 1. 用于创建对象的(相当于<bean id="" class="’>) @Component 作用:把资源让Spring 来管理。相当于在XML中配置一个bean。 属性:value:指定bean的id。如果不指定value属性,默认bean 的id 是当前类的类名,首字母小写。 @Controller @Service @Reposi...

renjingjingya0429的博客 274
上一篇: Spring基础知识总结(一):Spring 与 IOC 概述与初步使用
下一篇: Spring基础知识总结(三):AOP
金心靖晨
博客等级 码龄9年 460粉丝 211原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值