亿唐网不做网站做品牌考试题,制作网页用的最多的图像文件格式是,去泰国做网站发网站,网络营销的方法有哪些?举例说明作为一个Java人#xff0c;想必都或多或少的了解过Spring。对于其优势也能道个一二#xff0c;诸如方便解耦、支持AOP编程、支持声明式事务、方便测试等等。Spring也不仅仅局限于服务器端开发#xff0c;它可以做非常多的事情#xff0c;任何Java应用都可以在简单性、可测试… 作为一个Java人想必都或多或少的了解过Spring。对于其优势也能道个一二诸如方便解耦、支持AOP编程、支持声明式事务、方便测试等等。Spring也不仅仅局限于服务器端开发它可以做非常多的事情任何Java应用都可以在简单性、可测试性和松耦合等方面从Spring中受益。Spring丰富功能的底层都依赖于它的两个核心特性 控制反转 IOC (Inversion Of Control) 面向切面编程 AOP (Aspect-Oriented Programming) 控制反转指的是应用中的对象依赖关系不在由自己维护而交给Spring由它的容器帮我们维护因此也叫做依赖注入DI (Dependency Injection)。 一.使用BeanFactory解耦 这里使用BeanFactory来降低我们熟知的MVC编程模式中service层与dao层之间的耦合关系。 解耦前service层关键代码 // Service层中需要Dao层的实例来与数据库交互完成业务逻辑
public class UserServiceImpl implements UserService {private UserDao userDao new UserDaoImpl();public void registerUser(User user) {userDao.addUser(user);} 可以看出如果我们不做解耦操作那么Service层中强烈依赖UserDao的实现类UserDaoImpl即如果不new UserDaoImpl()Service层将寸步难行。 解耦后service层关键代码 public class UserServiceImpl implements UserService {private UserDao userDao;// 提供set方法public void setUserDao(UserDao userDao) {this.userDao userDao;}public void registerUser(User user) {userDao.addUser(user);} BeanFactory public class BeanFactory {private static MapString, Object beans new HashMapString, Object();//静态代码块加载资源static {try {ResourceBundle bundle ResourceBundle.getBundle(objects);EnumerationString keys bundle.getKeys();while (keys.hasMoreElements()) {String key keys.nextElement();String className bundle.getString(key);Object clazz Class.forName(className).newInstance();beans.put(key, clazz);}} catch (Exception e) {e.printStackTrace();throw new RuntimeException(加载类配置文件出错!);}}//对外提供获取bean的方法public static T T getBean(String className, ClassT T) {Object o beans.get(className);if (o ! null)return (T) o;else throw new RuntimeException(找不到类: className);}
} objects.properties userDaocom.dintalk.dao.impl.UserDaoImpl 为UserServiceImpl实例注入依赖 UserServiceImpl userServiceImpl new UserServiceImpl();
UserDao userDao BeanFactory.getBean(userDao,UserDao.class);
userServiceImpl.setUserDao(userDao); 总结 解耦前service层中直接new出了其所依赖的实例对象userDaoImpl。而通过工厂解耦后service中只声明了UserDao的接口引用并提供了set方法我们在使用servcie时可以通过set方法传入从工厂中获得的实现了UserDao接口的任一实现类的实例。而实现类的配置又暴露在了配置文件当中解耦的同时也增加了程序的动态性。 BeanFactory原理 这里使用的是静态工厂在工厂类中定义了一个Map用于存放工厂管理的Bean实例静态代码块随类的加载执行一次读取配置文件中的key-value信息。通过循环和反射将配置文件中的key仍作为Map的key将配置文件中key对应的类全限定名通过反射构造实例后作为其对应的value存于Map中。达到这样的效果BeanFactory类加载完毕后它便管理了一个Map集合Map集合的key就是配置文件中的keyMap中的value就是配置文件中value对应的类的实例。如此对外提供一个getBean方法通过key返回其对应的实例这便实现了通过BeanFactory来管理实例对象。 二.Spring使用步骤 以使用xml配置文件的方式示例 1.导入坐标或jar包 如果使用Maven构建我们可以导入spring-context。因为上下文模块依赖其他模块所有其他模块也会自动导入。 dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.0.2.RELEASE/version
/dependency 2.创建applicationContext.xml文件并加入头信息 在resources下创建spring的主配置文件添加头信息时需格外注意。最好保存模板或到官网复制粘贴稍有差错将导致异常。 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:phttp://www.springframework.org/schema/pxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdbean.../bean!-- 1.主配置文件中导入模块配置文件 --import resourceuser.xml/
/beans 3.在配置文件中装配Bean并加载配置文件获取Bean 可以按分模块在配置文件中装配Bean再在主配置文件中进行导入。但要注意如果出现id相同的情况后加载的配置会覆盖掉前面的配置 加载配置文件获取Bean ApplicationContext appContext new ClassPathXmlApplicationContext(applicationContext.xml);
UserDao userDao appContext.getBean(userDao, UserDao.class); Tips: Spring有自己的容器需要读取配置文件装配好Bean后放入自己的容器我们在用时直接找容器获取即可如果分模块配置了但没有在主文件中导入其他文件也可以在加载配置文件时一块加载 ApplicationContext appContext new ClassPathXmlApplicationContext(new String[] {applicationContext.xml,user.xml}); 三.IOC配置Bean的装配方式 Spring的一大特点是最小侵入性编程它不会强迫我们去实现它的接口或实现类POJO依旧是那个POJO。我们只是将依赖交由Spring管理因此IOC配置也就是Bean的装配便是很大一部分工作。Spring为我们提供了三种装配Bean的方式 基于xml配置文件 ★★★★ 基于注解往往配合xml配置文件使用 ★★★★ 基于java类的配置(会用到注解 其实无论使用哪一种方式我们的目的只有一个那就是我们要将程序中的依赖关系描述清楚将Bean装配好交由Spring的容器 1.基于xml文件的装配 bean的实例化 !-- 0.通过默认构造方法生产bean --
bean iduserDao classcn.dintalk.dao.impl.UserDaoImpl/bean
!-- 1.通过实例工厂生产bean --
bean idmyBeanFactory classcn.dintalk.factory.BeanFactory1/
bean idmyBean factory-beanmyBeanFactory factory-methodgetBean
!-- 2.通过静态工厂生产bean --
bean iduserDao1 classcn.dintalk.factory.BeanFactory factory-methodgetBean/!-- bean的存活范围及生命周期方法 --
bean iduserDao2 scopesingleton init-methodm1 destroy-methodm2
classcn.dintalk.dao.impl.UserDaoImpl/bean Tips: scope可选值 singleton prototype request session globalsession 生命周期方法在单例模式下才有意义想想是为什么呢 数据的注入 !-- 3.数据的注入 --
!-- 3.1构造方法注入 --
bean iduser classcn.dintalk.domain.Userconstructor-arg index0 value王舞/constructor-arg index1 valuewangwu/
/bean
!-- 3.2setter属性注入 --
bean iduser1 classcn.dintalk.domain.Userproperty namename value赵思/property namepassword valuezhaosi/
/bean
!-- 3.3p命名空间注入 --
bean iduser2 classcn.dintalk.domain.User p:name张珊 p:passwordzhangshan/!-- 4.常用数据类型的注入 --
bean iduser3 classcn.dintalk.domain.User!-- 4.0数组的注入 --property namemyArrarrayvaluestr1/valuevaluestr2/value/array/property!-- 4.1List的注入 --property namemyListlistvaluestr1/valuevaluestr2/value/list/property!-- 4.2Set的注入 --property namemySetsetvaluestr1/valuevaluestr2/value/set/property!-- 4.3Map的注入--property namemyMapmapentry keys1 valuestr1/entry keys2 valuestr2//map/property!-- 4.4Properties的注入 --property namemyPropropsprop keys1str1/propprop keys2str2/prop/props/property
/bean!-- 5.依赖的注入--
bean iduserService classcn.dintalk.service.impl.UserServiceImplproperty nameuserDao refuserDao/property
/bean 2.基于注解的装配 使用注解来装配bean可以简化我们的步骤提高效率。可以替代xml文件的装配方式但是一般是和xml文件的方式打双打。使用第三方工具包时使用xml的方式要方便一些章节末我们通过DButil的示例。由于xml的方式比较好理解而注解又是xml文件方式的简化因此我们对比着来学习。 bean的实例化 Component(accountService)
public class AccountServiceImpl implements AccountService{
/*
- Controller 用在表现层
- Service 用在业务层
- Respository 用在持久层
这三个注解的作用和Component完全一样就是更加语义化分层
*/
// bean的存活范围和生命周期
Component(accountService)
Scope(singleton)
public class AccountServiceImpl implements AccountService {
// 初始化方法
PostConstruct
private void init(){
// 销毁方法
PreDestroy
private void destroy(){ 数据的注入 Autowired
Qualifier(accountDao)
private AccountDao accountDao;
/*
- Autowired 自动装配查找Spring容器按照类型自动赋予对象。★★★
- Qualifier(accountDao) 与Autowired配合指定具体名称的实现类对象。★★★
- Resource(nameaccountDao) Spring对JSR-250中定义的注解的支持。
*/
// - Value 注入简单类型的数据
Value(16) // 值都是字符串类型spring会自行解析
private Integer age;
Value(张珊)
private String name; 基于注解的简单类型基本类型String数据注入意义不是很大都在源码里面和直接赋值区别不大。 基于注解的配置加载获取容器对象 方式一依旧使用ClassPathXmlApplicationContext需配置★★★ !-- 配置文件中指定扫描注解的包 --
context:component-scan base-packagecn.dintalk/ 方式二使用AnnotationConfigApplicationContext加载配置获取bean ApplicationContext context new AnnotationConfigApplicationContext(MyBean.class);MyBean myBean context.getBean(myBean, MyBean.class); Tips: 我一般使用方式一的配置但是要注意不要引错了头约束。 3.基于java类的装配 基于注解的通过组件扫描和自动装配实现Spring的自动化配置是更为推荐的方式但有时候自动化配置的方案行不通因此需要明确配置Spring。同样比如我们想将第三方库中的组件装配到我们的应用中这种情况下没有办法在它的类上添加Component和Autowired注解的。因此我们必须采用显示装配的方式显示装配有两种可选方案上述的xml装配方式和我们即将阐述的Java类的装配方式。还是那一句话无论是哪一种方式目的只有一个那就是将一些必要的信息告知我们的程序。 bean的实例化 Configuration //Spring配置类带有Configuratio注解就是配置类.加不加无所谓
ComponentScan(cn.dintalk) //context:component-scan base-packagecn.dintalk/
Import({JdbcConfig.class,MailConfig.class}) //聚合多个配置类import resource/
public class SpringConfig {/*
Configuration可不加因为我们在加载配置时还会指定到该类- ApplicationContext applicationContext new AnnotationConfigApplicationContext(SpringConfig.class);
*/PropertySource(jdbc.properties)//导入外部的properties文件
public class JdbcConfig {//读取properties文件中key对应的value值Value(${jdbc.driverClassName})private String driverClassName;Value(${jdbc.url})private String url;Value(${jdbc.username})private String username;Value(${jdbc.password})private String password;//创建数据源//告知spring容器将该方法的返回值对象以“druidDataSource”存放到容器中Bean(druidDataSource)public DataSource createDataSource(){DruidDataSource dataSource new DruidDataSource();dataSource.setDriverClassName(driverClassName);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}//创建QueryRunner对象并交给spring容器管理Bean(queryRunner)//Qualifier(druidDataSource) DataSource dataSource://数据源对象对应spring容器中一个名字叫做druidDataSource的public QueryRunner createQueryRunner(Qualifier(druidDataSource) DataSource dataSource){QueryRunner queryRunner new QueryRunner(dataSource);return queryRunner;} 数据的注入 参考同基于注解的装配 基于java类的配置加载 //AnnotationConfigApplicationContext构造参数指定配置类的类型
//可以指定多个
ApplicationContext applicationContext new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService applicationContext.getBean(userService, UserService.class); 四.DBUtils的使用 DBUtils是Apache提供的对JDBC封装了的公共组件。 1.普通的使用 第一步导入jar包或Maven坐标 dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.46/version/dependencydependencygroupIdcommons-dbutils/groupIdartifactIdcommons-dbutils/artifactIdversion1.7/version/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.0.14/version/dependency 第二步创建工具类 public class DruidUtil {private static DataSource dataSource;static {InputStream inputStream null;try {inputStream DruidUtil.class.getClassLoader().getResourceAsStream(jdbc.properties);Properties properties new Properties();properties.load(inputStream);dataSource DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(加载数据库配置文件失败);}finally {if (inputStream ! null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();throw new RuntimeException(关闭文件资源失败!);}}}}public static DataSource getDataSource(){ // 获取数据源return dataSource;}public Connection getConnection(){ // 获取连接try {return dataSource.getConnection();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}
} 第三步CRUD操作(DAO层) private QueryRunner queryRunner new QueryRunner(DruidUtil.getDataSource());
// 增删改 使用updatesql,params;
//update方法内部先从给定的数据源获取一个连接在方法即将执行完毕后将连接归还(到连接池)
public void addAccount(Account account) {if (account null)throw new RuntimeException(参数错误);try {queryRunner.update(insert into accounts values(null,?,?),account.getAccountName(), account.getBalance());} catch (SQLException e) {throw new RuntimeException(e);}}
//查询使用 query(sql,Handler,params)public Account findById(Integer aid) {if (aid null)throw new RuntimeException(参数异常);try {return queryRunner.query(select * from accounts where aid ?, newBeanHandlerAccount(Account.class), aid);} catch (SQLException e) {throw new RuntimeException(e);}} 2.使用Spring基于xml进行解耦 第一步导入Spring的jar包或Maven坐标 dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.0.2.RELEASE/version
/dependency 第二步创建applicationContext.xml文件并进行配置 !-- 1.配置druid数据源 --
bean iddruidDataSource classcom.alibaba.druid.pool.DruidDataSourceproperty namedriverClassName valuecom.mysql.jdbc.Driver/property nameurl valuejdbc:mysql:///spring02/property nameusername valuesh/property namepassword valuesh123/
/bean
!-- 2.配置QueryRunner --
bean idqueryRunner classorg.apache.commons.dbutils.QueryRunnerconstructor-arg index0 refdruidDataSource/
/bean
!-- 3.配置AccountDao --
bean idaccountDao classcn.dintalk.dao.impl.AccountDaoImplproperty namequeryRunner refqueryRunner/
/bean
!-- 4.配置AccountService --
bean idaccountService classcn.dintalk.service.impl.AccountServiceImplproperty nameaccountDao refaccountDao/
/bean 第三步CRUD操作 //DAO层 提供set方法以注入
private QueryRunner queryRunner;
public void setQueryRunner(QueryRunner queryRunner) {this.queryRunner queryRunner;
}//service层 提供set方法以注入
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) {this.accountDao accountDao;
}//CRUD操作同上 Tips: 配置加载方式 ApplicationContext appContext new ClassPathXmlApplicationContext(applicationContext.xml); 3.使用Spring基于注解进行解耦 由于使用到第三方包所以无法全部使用注解需要和xml的方式结合。 第一步配置applicationContext文件 !-- 1.基于注解,声明扫描注解的包 --
context:component-scan base-packagecn.dintalk/
!-- 2.配置druid数据源 --
bean iddruidDataSource classcom.alibaba.druid.pool.DruidDataSourceproperty namedriverClassName valuecom.mysql.jdbc.Driver/property nameurl valuejdbc:mysql:///spring02/property nameusername valuesh/property namepassword valuesh123/
/bean
!-- 3.配置QueryRunner --
bean idqueryRunner classorg.apache.commons.dbutils.QueryRunnerconstructor-arg index0 refdruidDataSource/
/bean 第二步添加注解 // DAO层中
Repository(accountDao)
public class AccountDaoImpl implements AccountDao {Autowiredprivate QueryRunner queryRunner;// Service层中
Service(accountService)
public class AccountServiceImpl implements AccountService {AutowiredQualifier(accountDao)private AccountDao accountDao; 第三步CRUD操作参上 Tips: 配置加载方式 ApplicationContext appContext new ClassPathXmlApplicationContext(applicationContext.xml); 4.使用Spring基于Java类进行解耦 第一步创建配置类 PropertySource(jdbc.properties)//导入外部的properties文件
ComponentScan(cn.dintalk) // 添加注解扫描包
public class SpringConfig {//读取properties文件中key对应的value值Value(${jdbc.driverClassName})private String driverClassName;Value(${jdbc.url})private String url;Value(${jdbc.username})private String username;Value(${jdbc.password})private String password;//创建数据源Bean(druidDataSource)public DataSource createDataSource(){DruidDataSource dataSource new DruidDataSource();dataSource.setDriverClassName(driverClassName);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}//创建QueryRunner对象并交给spring容器管理Bean(queryRunner)//Qualifier(druidDataSource) DataSource dataSource:数据源对象对应spring容器中一个名字叫做druidDataSource的public QueryRunner createQueryRunner(Qualifier(druidDataSource) DataSource dataSource){QueryRunner queryRunner new QueryRunner(dataSource);return queryRunner;} 第二步添加注解 // DAO层中
Repository(accountDao)
public class AccountDaoImpl implements AccountDao {Autowiredprivate QueryRunner queryRunner;// Service层中
Service(accountService)
public class AccountServiceImpl implements AccountService {AutowiredQualifier(accountDao)private AccountDao accountDao; 第三步CRUD参上 Tips: 配置加载方式 ApplicationContext context new AnnotationConfigApplicationContext(SpringConfig.class); V.附录常用文件约束头 applicationContext.xml文件头约束 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
/beans 带有p命名空间的约束头 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:phttp://www.springframework.org/schema/pxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
/beans 带有context命名空间的约束头 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd
/beans 关注微信公众号随时随地学习 转载于:https://www.cnblogs.com/dintalk/p/10880873.html